Merge remote-tracking branches 'asoc/topic/wm8776', 'asoc/topic/wm8804', 'asoc/topic...
[firefly-linux-kernel-4.4.55.git] / sound / soc / codecs / wm8903.c
index c038b3e04398069b050b526ab2b6baca5cdfd2a9..cc6b0ef98a345e9b8832bb4c09d1312451d7d070 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/regmap.h>
 #include <linux/slab.h>
 #include <linux/irq.h>
+#include <linux/mutex.h>
 #include <sound/core.h>
 #include <sound/jack.h>
 #include <sound/pcm.h>
@@ -117,12 +118,12 @@ static const struct reg_default wm8903_reg_defaults[] = {
 struct wm8903_priv {
        struct wm8903_platform_data *pdata;
        struct device *dev;
-       struct snd_soc_codec *codec;
        struct regmap *regmap;
 
        int sysclk;
        int irq;
 
+       struct mutex lock;
        int fs;
        int deemph;
 
@@ -457,7 +458,7 @@ static int wm8903_put_deemph(struct snd_kcontrol *kcontrol,
        if (deemph > 1)
                return -EINVAL;
 
-       mutex_lock(&codec->mutex);
+       mutex_lock(&wm8903->lock);
        if (wm8903->deemph != deemph) {
                wm8903->deemph = deemph;
 
@@ -465,7 +466,7 @@ static int wm8903_put_deemph(struct snd_kcontrol *kcontrol,
 
                ret = 1;
        }
-       mutex_unlock(&codec->mutex);
+       mutex_unlock(&wm8903->lock);
 
        return ret;
 }
@@ -1757,21 +1758,12 @@ static struct snd_soc_dai_driver wm8903_dai = {
        .symmetric_rates = 1,
 };
 
-static int wm8903_suspend(struct snd_soc_codec *codec)
-{
-       wm8903_set_bias_level(codec, SND_SOC_BIAS_OFF);
-
-       return 0;
-}
-
 static int wm8903_resume(struct snd_soc_codec *codec)
 {
        struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec);
 
        regcache_sync(wm8903->regmap);
 
-       wm8903_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-
        return 0;
 }
 
@@ -1889,33 +1881,12 @@ static void wm8903_free_gpio(struct wm8903_priv *wm8903)
 }
 #endif
 
-static int wm8903_probe(struct snd_soc_codec *codec)
-{
-       struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec);
-
-       wm8903->codec = codec;
-
-       /* power on device */
-       wm8903_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-
-       return 0;
-}
-
-/* power down chip */
-static int wm8903_remove(struct snd_soc_codec *codec)
-{
-       wm8903_set_bias_level(codec, SND_SOC_BIAS_OFF);
-
-       return 0;
-}
-
 static struct snd_soc_codec_driver soc_codec_dev_wm8903 = {
-       .probe =        wm8903_probe,
-       .remove =       wm8903_remove,
-       .suspend =      wm8903_suspend,
        .resume =       wm8903_resume,
        .set_bias_level = wm8903_set_bias_level,
        .seq_notifier = wm8903_seq_notifier,
+       .suspend_bias_off = true,
+
        .controls = wm8903_snd_controls,
        .num_controls = ARRAY_SIZE(wm8903_snd_controls),
        .dapm_widgets = wm8903_dapm_widgets,
@@ -2023,6 +1994,8 @@ static int wm8903_i2c_probe(struct i2c_client *i2c,
                              GFP_KERNEL);
        if (wm8903 == NULL)
                return -ENOMEM;
+
+       mutex_init(&wm8903->lock);
        wm8903->dev = &i2c->dev;
 
        wm8903->regmap = devm_regmap_init_i2c(i2c, &wm8903_regmap);