|
@@ -93,8 +93,12 @@
|
|
|
#define MICB_1_EN_TX3_GND_SEL_TX_GND 0
|
|
|
|
|
|
#define CDC_A_MICB_1_VAL (0xf141)
|
|
|
+#define MICB_MIN_VAL 1600
|
|
|
+#define MICB_STEP_SIZE 50
|
|
|
+#define MICB_VOLTAGE_REGVAL(v) ((v - MICB_MIN_VAL)/MICB_STEP_SIZE)
|
|
|
#define MICB_1_VAL_MICB_OUT_VAL_MASK GENMASK(7, 3)
|
|
|
#define MICB_1_VAL_MICB_OUT_VAL_V2P70V ((0x16) << 3)
|
|
|
+#define MICB_1_VAL_MICB_OUT_VAL_V1P80V ((0x4) << 3)
|
|
|
#define CDC_A_MICB_1_CTL (0xf142)
|
|
|
|
|
|
#define MICB_1_CTL_CFILT_REF_SEL_MASK BIT(1)
|
|
@@ -225,6 +229,7 @@ struct pm8916_wcd_analog_priv {
|
|
|
struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
|
|
|
unsigned int micbias1_cap_mode;
|
|
|
unsigned int micbias2_cap_mode;
|
|
|
+ unsigned int micbias_mv;
|
|
|
};
|
|
|
|
|
|
static const char *const adc2_mux_text[] = { "ZERO", "INP2", "INP3" };
|
|
@@ -265,18 +270,25 @@ static const struct snd_kcontrol_new pm8916_wcd_analog_snd_controls[] = {
|
|
|
|
|
|
static void pm8916_wcd_analog_micbias_enable(struct snd_soc_codec *codec)
|
|
|
{
|
|
|
+ struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec);
|
|
|
+
|
|
|
snd_soc_update_bits(codec, CDC_A_MICB_1_CTL,
|
|
|
MICB_1_CTL_EXT_PRECHARG_EN_MASK |
|
|
|
MICB_1_CTL_INT_PRECHARG_BYP_MASK,
|
|
|
MICB_1_CTL_INT_PRECHARG_BYP_EXT_PRECHRG_SEL
|
|
|
| MICB_1_CTL_EXT_PRECHARG_EN_ENABLE);
|
|
|
|
|
|
- snd_soc_write(codec, CDC_A_MICB_1_VAL, MICB_1_VAL_MICB_OUT_VAL_V2P70V);
|
|
|
- /*
|
|
|
- * Special headset needs MICBIAS as 2.7V so wait for
|
|
|
- * 50 msec for the MICBIAS to reach 2.7 volts.
|
|
|
- */
|
|
|
- msleep(50);
|
|
|
+ if (wcd->micbias_mv) {
|
|
|
+ snd_soc_write(codec, CDC_A_MICB_1_VAL,
|
|
|
+ MICB_VOLTAGE_REGVAL(wcd->micbias_mv));
|
|
|
+ /*
|
|
|
+ * Special headset needs MICBIAS as 2.7V so wait for
|
|
|
+ * 50 msec for the MICBIAS to reach 2.7 volts.
|
|
|
+ */
|
|
|
+ if (wcd->micbias_mv >= 2700)
|
|
|
+ msleep(50);
|
|
|
+ }
|
|
|
+
|
|
|
snd_soc_update_bits(codec, CDC_A_MICB_1_CTL,
|
|
|
MICB_1_CTL_EXT_PRECHARG_EN_MASK |
|
|
|
MICB_1_CTL_INT_PRECHARG_BYP_MASK, 0);
|
|
@@ -795,6 +807,9 @@ static int pm8916_wcd_analog_parse_dt(struct device *dev,
|
|
|
else
|
|
|
priv->micbias2_cap_mode = MICB_1_EN_NO_EXT_BYP_CAP;
|
|
|
|
|
|
+ of_property_read_u32(dev->of_node, "qcom,micbias-lvl",
|
|
|
+ &priv->micbias_mv);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|