ASoC: max98090: read micbias from device property
authorFang, Yang A <yang.a.fang@intel.com>
Fri, 29 May 2015 18:56:10 +0000 (11:56 -0700)
committerMark Brown <broonie@kernel.org>
Tue, 2 Jun 2015 17:11:03 +0000 (18:11 +0100)
This patch reads max98090 micbias from acpi or dt

Signed-off-by: Fang, Yang A <yang.a.fang@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Documentation/devicetree/bindings/sound/max98090.txt
sound/soc/codecs/max98090.c

index aa802a274520793a4ae3f46fa3edb8d55be1083c..4e3be6682c98c97c04ea6e8983edaca1beb22fbe 100644 (file)
@@ -18,6 +18,12 @@ Optional properties:
 
 - maxim,dmic-freq: Frequency at which to clock DMIC
 
+- maxim,micbias: Micbias voltage applies to the analog mic, valid voltages value are:
+       0 - 2.2v
+       1 - 2.55v
+       2 - 2.4v
+       3 - 2.8v
+
 Pins on the device (for linking into audio routes):
 
   * MIC1
index 3e33ef2acf3c993b6ae1d87317452c9fb4e9021c..9d80c68abdd5145d6616ccdd348e9507adeab40a 100644 (file)
@@ -2422,6 +2422,8 @@ static int max98090_probe(struct snd_soc_codec *codec)
        struct max98090_cdata *cdata;
        enum max98090_type devtype;
        int ret = 0;
+       int err;
+       unsigned int micbias;
 
        dev_dbg(codec->dev, "max98090_probe\n");
 
@@ -2506,8 +2508,17 @@ static int max98090_probe(struct snd_soc_codec *codec)
        snd_soc_write(codec, M98090_REG_BIAS_CONTROL,
                M98090_VCM_MODE_MASK);
 
+       err = device_property_read_u32(codec->dev, "maxim,micbias", &micbias);
+       if (err) {
+               micbias = M98090_MBVSEL_2V8;
+               dev_info(codec->dev, "use default 2.8v micbias\n");
+       } else if (micbias < M98090_MBVSEL_2V2 || micbias > M98090_MBVSEL_2V8) {
+               dev_err(codec->dev, "micbias out of range 0x%x\n", micbias);
+               micbias = M98090_MBVSEL_2V8;
+       }
+
        snd_soc_update_bits(codec, M98090_REG_MIC_BIAS_VOLTAGE,
-               M98090_MBVSEL_MASK, M98090_MBVSEL_2V8);
+               M98090_MBVSEL_MASK, micbias);
 
        max98090_add_widgets(codec);