|
93 | 93 | #define MICB_1_EN_TX3_GND_SEL_TX_GND 0
|
94 | 94 |
|
95 | 95 | #define CDC_A_MICB_1_VAL (0xf141)
|
| 96 | +#define MICB_MIN_VAL 1600 |
| 97 | +#define MICB_STEP_SIZE 50 |
| 98 | +#define MICB_VOLTAGE_REGVAL(v) ((v - MICB_MIN_VAL)/MICB_STEP_SIZE) |
96 | 99 | #define MICB_1_VAL_MICB_OUT_VAL_MASK GENMASK(7, 3)
|
97 | 100 | #define MICB_1_VAL_MICB_OUT_VAL_V2P70V ((0x16) << 3)
|
| 101 | +#define MICB_1_VAL_MICB_OUT_VAL_V1P80V ((0x4) << 3) |
98 | 102 | #define CDC_A_MICB_1_CTL (0xf142)
|
99 | 103 |
|
100 | 104 | #define MICB_1_CTL_CFILT_REF_SEL_MASK BIT(1)
|
@@ -225,6 +229,7 @@ struct pm8916_wcd_analog_priv {
|
225 | 229 | struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
|
226 | 230 | unsigned int micbias1_cap_mode;
|
227 | 231 | unsigned int micbias2_cap_mode;
|
| 232 | + unsigned int micbias_mv; |
228 | 233 | };
|
229 | 234 |
|
230 | 235 | 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[] = {
|
265 | 270 |
|
266 | 271 | static void pm8916_wcd_analog_micbias_enable(struct snd_soc_codec *codec)
|
267 | 272 | {
|
| 273 | + struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec); |
| 274 | + |
268 | 275 | snd_soc_update_bits(codec, CDC_A_MICB_1_CTL,
|
269 | 276 | MICB_1_CTL_EXT_PRECHARG_EN_MASK |
|
270 | 277 | MICB_1_CTL_INT_PRECHARG_BYP_MASK,
|
271 | 278 | MICB_1_CTL_INT_PRECHARG_BYP_EXT_PRECHRG_SEL
|
272 | 279 | | MICB_1_CTL_EXT_PRECHARG_EN_ENABLE);
|
273 | 280 |
|
274 |
| - snd_soc_write(codec, CDC_A_MICB_1_VAL, MICB_1_VAL_MICB_OUT_VAL_V2P70V); |
275 |
| - /* |
276 |
| - * Special headset needs MICBIAS as 2.7V so wait for |
277 |
| - * 50 msec for the MICBIAS to reach 2.7 volts. |
278 |
| - */ |
279 |
| - msleep(50); |
| 281 | + if (wcd->micbias_mv) { |
| 282 | + snd_soc_write(codec, CDC_A_MICB_1_VAL, |
| 283 | + MICB_VOLTAGE_REGVAL(wcd->micbias_mv)); |
| 284 | + /* |
| 285 | + * Special headset needs MICBIAS as 2.7V so wait for |
| 286 | + * 50 msec for the MICBIAS to reach 2.7 volts. |
| 287 | + */ |
| 288 | + if (wcd->micbias_mv >= 2700) |
| 289 | + msleep(50); |
| 290 | + } |
| 291 | + |
280 | 292 | snd_soc_update_bits(codec, CDC_A_MICB_1_CTL,
|
281 | 293 | MICB_1_CTL_EXT_PRECHARG_EN_MASK |
|
282 | 294 | MICB_1_CTL_INT_PRECHARG_BYP_MASK, 0);
|
@@ -795,6 +807,9 @@ static int pm8916_wcd_analog_parse_dt(struct device *dev,
|
795 | 807 | else
|
796 | 808 | priv->micbias2_cap_mode = MICB_1_EN_NO_EXT_BYP_CAP;
|
797 | 809 |
|
| 810 | + of_property_read_u32(dev->of_node, "qcom,micbias-lvl", |
| 811 | + &priv->micbias_mv); |
| 812 | + |
798 | 813 | return 0;
|
799 | 814 | }
|
800 | 815 |
|
|
0 commit comments