ASoC: Support configuration of WM8958 microphone bias analogue parameters
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 22 Feb 2011 01:11:59 +0000 (17:11 -0800)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 22 Feb 2011 18:42:06 +0000 (10:42 -0800)
The WM8958 has a different microphone bias architecture to WM8994 so needs
different configuration to WM8994. Support this in platform data.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
include/linux/mfd/wm8994/pdata.h
include/linux/mfd/wm8994/registers.h
sound/soc/codecs/wm8994.c

index 06869466b7f0d7f44ad523c174f01b43800abb05..466b1c777aff09033d449b92f6244bd701ff52f9 100644 (file)
@@ -108,13 +108,16 @@ struct wm8994_pdata {
         */
        int micdet_irq;
 
-        /* Microphone biases: 0=0.9*AVDD1 1=0.65*AVVD1 */
+        /* WM8994 microphone biases: 0=0.9*AVDD1 1=0.65*AVVD1 */
         unsigned int micbias1_lvl:1;
         unsigned int micbias2_lvl:1;
 
-        /* Jack detect threashold levels, see datasheet for values */
+        /* WM8994 jack detect threashold levels, see datasheet for values */
         unsigned int jd_scthr:2;
         unsigned int jd_thr:2;
+
+       /* WM8958 microphone bias configuration */
+       int micbias[2];
 };
 
 #endif
index be072faec6f03e618f06b9ea206e82180adb2b01..f3ee84284670f5e42fc4871cdfc18bc2f7171d87 100644 (file)
@@ -63,6 +63,8 @@
 #define WM8994_MICBIAS                          0x3A
 #define WM8994_LDO_1                            0x3B
 #define WM8994_LDO_2                            0x3C
+#define WM8958_MICBIAS1                                0x3D
+#define WM8958_MICBIAS2                                0x3E
 #define WM8994_CHARGE_PUMP_1                    0x4C
 #define WM8958_CHARGE_PUMP_2                    0x4D
 #define WM8994_CLASS_W_1                        0x51
index 1ad6e3db7804868adb3d7ca3a0ab957f677e3c24..9b9c15ffb7d275cdc7e32103f3af32a8e1537ed5 100644 (file)
@@ -2855,6 +2855,13 @@ static void wm8994_handle_pdata(struct wm8994_priv *wm8994)
        else
                snd_soc_add_controls(wm8994->codec, wm8994_eq_controls,
                                     ARRAY_SIZE(wm8994_eq_controls));
+
+       for (i = 0; i < ARRAY_SIZE(pdata->micbias); i++) {
+               if (pdata->micbias[i]) {
+                       snd_soc_write(codec, WM8958_MICBIAS1 + i,
+                               pdata->micbias[i] & 0xffff);
+               }
+       }
 }
 
 /**