OSDN Git Service

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 0686946..466b1c7 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 be072fa..f3ee842 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 1ad6e3d..9b9c15f 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);
+               }
+       }
 }
 
 /**