Allow the MICBIAS voltages and other attributes to be configured by the
platform.

Signed-off-by: Mark Brown <[email protected]>
---
 drivers/mfd/arizona-core.c        |   23 +++++++++++++++++++++++
 include/linux/mfd/arizona/pdata.h |   12 ++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c
index 0bb79c8..06d245a 100644
--- a/drivers/mfd/arizona-core.c
+++ b/drivers/mfd/arizona-core.c
@@ -518,6 +518,29 @@ int arizona_dev_init(struct arizona *arizona)
                goto err_reset;
        }
 
+       for (i = 0; i < ARIZONA_MAX_MICBIAS; i++) {
+               if (!arizona->pdata.micbias[i].mV)
+                       continue;
+
+               val = (arizona->pdata.micbias[i].mV - 1500) / 100;
+               val <<= ARIZONA_MICB1_LVL_SHIFT;
+
+               if (arizona->pdata.micbias[i].ext_cap)
+                       val |= ARIZONA_MICB1_EXT_CAP;
+
+               if (arizona->pdata.micbias[i].discharge)
+                       val |= ARIZONA_MICB1_DISCH;
+
+               if (arizona->pdata.micbias[i].fast_start)
+                       val |= ARIZONA_MICB1_RATE;
+
+               regmap_update_bits(arizona->regmap,
+                                  ARIZONA_MIC_BIAS_CTRL_1 + i,
+                                  ARIZONA_MICB1_LVL_MASK |
+                                  ARIZONA_MICB1_DISCH |
+                                  ARIZONA_MICB1_RATE, val);
+       }
+
        for (i = 0; i < ARIZONA_MAX_INPUT; i++) {
                /* Default for both is 0 so noop with defaults */
                val = arizona->pdata.dmic_ref[i]
diff --git a/include/linux/mfd/arizona/pdata.h 
b/include/linux/mfd/arizona/pdata.h
index 73822bd..32992a6 100644
--- a/include/linux/mfd/arizona/pdata.h
+++ b/include/linux/mfd/arizona/pdata.h
@@ -56,6 +56,8 @@
 #define ARIZONA_DMIC_MICBIAS2 2
 #define ARIZONA_DMIC_MICBIAS3 3
 
+#define ARIZONA_MAX_MICBIAS 3
+
 #define ARIZONA_INMODE_DIFF 0
 #define ARIZONA_INMODE_SE   1
 #define ARIZONA_INMODE_DMIC 2
@@ -71,6 +73,13 @@
 
 struct regulator_init_data;
 
+struct arizona_micbias {
+       int mV;                    /** Regulated voltage */
+       unsigned int ext_cap:1;    /** External capacitor fitted */
+       unsigned int discharge:1;  /** Actively discharge */
+       unsigned int fast_start:1; /** Enable aggressive startup ramp rate */
+};
+
 struct arizona_micd_config {
        unsigned int src;
        unsigned int bias;
@@ -111,6 +120,9 @@ struct arizona_pdata {
        /** Reference voltage for DMIC inputs */
        int dmic_ref[ARIZONA_MAX_INPUT];
 
+       /** MICBIAS configurations */
+       struct arizona_micbias micbias[ARIZONA_MAX_MICBIAS];
+
        /** Mode of input structures */
        int inmode[ARIZONA_MAX_INPUT];
 
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to