blob: 67a5d8af358de03bae89035b40dfab89e133dd55 [file] [log] [blame]
Kiran Kandic3b24402012-06-11 00:05:59 -07001/* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12#include <linux/module.h>
13#include <linux/init.h>
14#include <linux/firmware.h>
15#include <linux/slab.h>
16#include <linux/platform_device.h>
17#include <linux/device.h>
18#include <linux/printk.h>
19#include <linux/ratelimit.h>
20#include <linux/debugfs.h>
21#include <linux/mfd/wcd9xxx/core.h>
22#include <linux/mfd/wcd9xxx/wcd9xxx_registers.h>
23#include <linux/mfd/wcd9xxx/wcd9320_registers.h>
24#include <linux/mfd/wcd9xxx/pdata.h>
25#include <sound/pcm.h>
26#include <sound/pcm_params.h>
27#include <sound/soc.h>
28#include <sound/soc-dapm.h>
29#include <sound/tlv.h>
30#include <linux/bitops.h>
31#include <linux/delay.h>
32#include <linux/pm_runtime.h>
33#include <linux/kernel.h>
34#include <linux/gpio.h>
35#include "wcd9320.h"
36
37#define WCD9320_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
38 SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\
39 SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000)
40
41
42#define NUM_DECIMATORS 10
43#define NUM_INTERPOLATORS 7
44#define BITS_PER_REG 8
45#define TAIKO_CFILT_FAST_MODE 0x00
46#define TAIKO_CFILT_SLOW_MODE 0x40
47#define MBHC_FW_READ_ATTEMPTS 15
48#define MBHC_FW_READ_TIMEOUT 2000000
49
50enum {
51 MBHC_USE_HPHL_TRIGGER = 1,
52 MBHC_USE_MB_TRIGGER = 2
53};
54
55#define MBHC_NUM_DCE_PLUG_DETECT 3
56#define NUM_ATTEMPTS_INSERT_DETECT 25
57#define NUM_ATTEMPTS_TO_REPORT 5
58
59#define TAIKO_JACK_MASK (SND_JACK_HEADSET | SND_JACK_OC_HPHL | \
60 SND_JACK_OC_HPHR | SND_JACK_UNSUPPORTED)
61
62#define TAIKO_I2S_MASTER_MODE_MASK 0x08
63
64#define TAIKO_OCP_ATTEMPT 1
65
66#define AIF1_PB 1
67#define AIF1_CAP 2
68#define AIF2_PB 3
69#define AIF2_CAP 4
70#define AIF3_CAP 5
71#define AIF3_PB 6
72
73#define NUM_CODEC_DAIS 6
74#define TAIKO_COMP_DIGITAL_GAIN_OFFSET 3
75
76struct taiko_codec_dai_data {
77 u32 rate;
78 u32 *ch_num;
79 u32 ch_act;
80 u32 ch_tot;
81};
82
83#define TAIKO_MCLK_RATE_12288KHZ 12288000
84#define TAIKO_MCLK_RATE_9600KHZ 9600000
85
86#define TAIKO_FAKE_INS_THRESHOLD_MS 2500
87#define TAIKO_FAKE_REMOVAL_MIN_PERIOD_MS 50
88
89#define TAIKO_MBHC_BUTTON_MIN 0x8000
90
91#define TAIKO_MBHC_FAKE_INSERT_LOW 10
92#define TAIKO_MBHC_FAKE_INSERT_HIGH 80
93#define TAIKO_MBHC_FAKE_INS_HIGH_NO_GPIO 150
94
95#define TAIKO_MBHC_STATUS_REL_DETECTION 0x0C
96
97#define TAIKO_MBHC_GPIO_REL_DEBOUNCE_TIME_MS 200
98
99#define TAIKO_MBHC_FAKE_INS_DELTA_MV 200
100#define TAIKO_MBHC_FAKE_INS_DELTA_SCALED_MV 300
101
102#define TAIKO_HS_DETECT_PLUG_TIME_MS (5 * 1000)
103#define TAIKO_HS_DETECT_PLUG_INERVAL_MS 100
104
105#define TAIKO_GPIO_IRQ_DEBOUNCE_TIME_US 5000
106
107#define TAIKO_MBHC_GND_MIC_SWAP_THRESHOLD 2
108
109#define TAIKO_ACQUIRE_LOCK(x) do { mutex_lock(&x); } while (0)
110#define TAIKO_RELEASE_LOCK(x) do { mutex_unlock(&x); } while (0)
111
112static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0);
113static const DECLARE_TLV_DB_SCALE(line_gain, 0, 7, 1);
114static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1);
115static struct snd_soc_dai_driver taiko_dai[];
116static const DECLARE_TLV_DB_SCALE(aux_pga_gain, 0, 2, 0);
117
118enum taiko_bandgap_type {
119 TAIKO_BANDGAP_OFF = 0,
120 TAIKO_BANDGAP_AUDIO_MODE,
121 TAIKO_BANDGAP_MBHC_MODE,
122};
123
124struct mbhc_micbias_regs {
125 u16 cfilt_val;
126 u16 cfilt_ctl;
127 u16 mbhc_reg;
128 u16 int_rbias;
129 u16 ctl_reg;
130 u8 cfilt_sel;
131};
132
133/* Codec supports 2 IIR filters */
134enum {
135 IIR1 = 0,
136 IIR2,
137 IIR_MAX,
138};
139/* Codec supports 5 bands */
140enum {
141 BAND1 = 0,
142 BAND2,
143 BAND3,
144 BAND4,
145 BAND5,
146 BAND_MAX,
147};
148
149enum {
150 COMPANDER_1 = 0,
151 COMPANDER_2,
152 COMPANDER_MAX,
153};
154
155enum {
156 COMPANDER_FS_8KHZ = 0,
157 COMPANDER_FS_16KHZ,
158 COMPANDER_FS_32KHZ,
159 COMPANDER_FS_48KHZ,
160 COMPANDER_FS_96KHZ,
161 COMPANDER_FS_192KHZ,
162 COMPANDER_FS_MAX,
163};
164
165/* Flags to track of PA and DAC state.
166 * PA and DAC should be tracked separately as AUXPGA loopback requires
167 * only PA to be turned on without DAC being on. */
168enum taiko_priv_ack_flags {
169 TAIKO_HPHL_PA_OFF_ACK = 0,
170 TAIKO_HPHR_PA_OFF_ACK,
171 TAIKO_HPHL_DAC_OFF_ACK,
172 TAIKO_HPHR_DAC_OFF_ACK
173};
174
175
176struct comp_sample_dependent_params {
177 u32 peak_det_timeout;
178 u32 rms_meter_div_fact;
179 u32 rms_meter_resamp_fact;
180};
181
182/* Data used by MBHC */
183struct mbhc_internal_cal_data {
184 u16 dce_z;
185 u16 dce_mb;
186 u16 sta_z;
187 u16 sta_mb;
188 u32 t_sta_dce;
189 u32 t_dce;
190 u32 t_sta;
191 u32 micb_mv;
192 u16 v_ins_hu;
193 u16 v_ins_h;
194 u16 v_b1_hu;
195 u16 v_b1_h;
196 u16 v_b1_huc;
197 u16 v_brh;
198 u16 v_brl;
199 u16 v_no_mic;
200 u8 npoll;
201 u8 nbounce_wait;
202 s16 adj_v_hs_max;
203 u16 adj_v_ins_hu;
204 u16 adj_v_ins_h;
205 s16 v_inval_ins_low;
206 s16 v_inval_ins_high;
207};
208
209struct taiko_reg_address {
210 u16 micb_4_ctl;
211 u16 micb_4_int_rbias;
212 u16 micb_4_mbhc;
213};
214
215enum taiko_mbhc_plug_type {
216 PLUG_TYPE_INVALID = -1,
217 PLUG_TYPE_NONE,
218 PLUG_TYPE_HEADSET,
219 PLUG_TYPE_HEADPHONE,
220 PLUG_TYPE_HIGH_HPH,
221 PLUG_TYPE_GND_MIC_SWAP,
222};
223
224enum taiko_mbhc_state {
225 MBHC_STATE_NONE = -1,
226 MBHC_STATE_POTENTIAL,
227 MBHC_STATE_POTENTIAL_RECOVERY,
228 MBHC_STATE_RELEASE,
229};
230
231struct hpf_work {
232 struct taiko_priv *taiko;
233 u32 decimator;
234 u8 tx_hpf_cut_of_freq;
235 struct delayed_work dwork;
236};
237
238static struct hpf_work tx_hpf_work[NUM_DECIMATORS];
239
240struct taiko_priv {
241 struct snd_soc_codec *codec;
242 struct taiko_reg_address reg_addr;
243 u32 adc_count;
244 u32 cfilt1_cnt;
245 u32 cfilt2_cnt;
246 u32 cfilt3_cnt;
247 u32 rx_bias_count;
248 s32 dmic_1_2_clk_cnt;
249 s32 dmic_3_4_clk_cnt;
250 s32 dmic_5_6_clk_cnt;
251
252 enum taiko_bandgap_type bandgap_type;
253 bool mclk_enabled;
254 bool clock_active;
255 bool config_mode_active;
256 bool mbhc_polling_active;
257 unsigned long mbhc_fake_ins_start;
258 int buttons_pressed;
259 enum taiko_mbhc_state mbhc_state;
260 struct taiko_mbhc_config mbhc_cfg;
261 struct mbhc_internal_cal_data mbhc_data;
262
263 struct wcd9xxx_pdata *pdata;
264 u32 anc_slot;
265
266 bool no_mic_headset_override;
267 /* Delayed work to report long button press */
268 struct delayed_work mbhc_btn_dwork;
269
270 struct mbhc_micbias_regs mbhc_bias_regs;
271 bool mbhc_micbias_switched;
272
273 /* track PA/DAC state */
274 unsigned long hph_pa_dac_state;
275
276 /*track taiko interface type*/
277 u8 intf_type;
278
279 u32 hph_status; /* track headhpone status */
280 /* define separate work for left and right headphone OCP to avoid
281 * additional checking on which OCP event to report so no locking
282 * to ensure synchronization is required
283 */
284 struct work_struct hphlocp_work; /* reporting left hph ocp off */
285 struct work_struct hphrocp_work; /* reporting right hph ocp off */
286
287 u8 hphlocp_cnt; /* headphone left ocp retry */
288 u8 hphrocp_cnt; /* headphone right ocp retry */
289
290 /* Work to perform MBHC Firmware Read */
291 struct delayed_work mbhc_firmware_dwork;
292 const struct firmware *mbhc_fw;
293
294 /* num of slim ports required */
295 struct taiko_codec_dai_data dai[NUM_CODEC_DAIS];
296
297 /*compander*/
298 int comp_enabled[COMPANDER_MAX];
299 u32 comp_fs[COMPANDER_MAX];
300
301 /* Maintain the status of AUX PGA */
302 int aux_pga_cnt;
303 u8 aux_l_gain;
304 u8 aux_r_gain;
305
306 struct delayed_work mbhc_insert_dwork;
307 unsigned long mbhc_last_resume; /* in jiffies */
308
309 u8 current_plug;
310 struct work_struct hs_correct_plug_work;
311 bool hs_detect_work_stop;
312 bool hs_polling_irq_prepared;
313 bool lpi_enabled; /* low power insertion detection */
314 bool in_gpio_handler;
315 /* Currently, only used for mbhc purpose, to protect
316 * concurrent execution of mbhc threaded irq handlers and
317 * kill race between DAPM and MBHC.But can serve as a
318 * general lock to protect codec resource
319 */
320 struct mutex codec_resource_lock;
321
322#ifdef CONFIG_DEBUG_FS
323 struct dentry *debugfs_poke;
324 struct dentry *debugfs_mbhc;
325#endif
326};
327
328
329static const u32 comp_shift[] = {
330 0,
331 2,
332};
333
334static const int comp_rx_path[] = {
335 COMPANDER_1,
336 COMPANDER_1,
337 COMPANDER_2,
338 COMPANDER_2,
339 COMPANDER_2,
340 COMPANDER_2,
341 COMPANDER_MAX,
342};
343
344static const struct comp_sample_dependent_params comp_samp_params[] = {
345 {
346 .peak_det_timeout = 0x2,
347 .rms_meter_div_fact = 0x8 << 4,
348 .rms_meter_resamp_fact = 0x21,
349 },
350 {
351 .peak_det_timeout = 0x3,
352 .rms_meter_div_fact = 0x9 << 4,
353 .rms_meter_resamp_fact = 0x28,
354 },
355
356 {
357 .peak_det_timeout = 0x5,
358 .rms_meter_div_fact = 0xB << 4,
359 .rms_meter_resamp_fact = 0x28,
360 },
361
362 {
363 .peak_det_timeout = 0x5,
364 .rms_meter_div_fact = 0xB << 4,
365 .rms_meter_resamp_fact = 0x28,
366 },
367};
368
369static unsigned short rx_digital_gain_reg[] = {
370 TAIKO_A_CDC_RX1_VOL_CTL_B2_CTL,
371 TAIKO_A_CDC_RX2_VOL_CTL_B2_CTL,
372 TAIKO_A_CDC_RX3_VOL_CTL_B2_CTL,
373 TAIKO_A_CDC_RX4_VOL_CTL_B2_CTL,
374 TAIKO_A_CDC_RX5_VOL_CTL_B2_CTL,
375 TAIKO_A_CDC_RX6_VOL_CTL_B2_CTL,
376 TAIKO_A_CDC_RX7_VOL_CTL_B2_CTL,
377};
378
379
380static unsigned short tx_digital_gain_reg[] = {
381 TAIKO_A_CDC_TX1_VOL_CTL_GAIN,
382 TAIKO_A_CDC_TX2_VOL_CTL_GAIN,
383 TAIKO_A_CDC_TX3_VOL_CTL_GAIN,
384 TAIKO_A_CDC_TX4_VOL_CTL_GAIN,
385 TAIKO_A_CDC_TX5_VOL_CTL_GAIN,
386 TAIKO_A_CDC_TX6_VOL_CTL_GAIN,
387 TAIKO_A_CDC_TX7_VOL_CTL_GAIN,
388 TAIKO_A_CDC_TX8_VOL_CTL_GAIN,
389 TAIKO_A_CDC_TX9_VOL_CTL_GAIN,
390 TAIKO_A_CDC_TX10_VOL_CTL_GAIN,
391};
392
393static int taiko_codec_enable_charge_pump(struct snd_soc_dapm_widget *w,
394 struct snd_kcontrol *kcontrol, int event)
395{
396 struct snd_soc_codec *codec = w->codec;
397
398 pr_debug("%s %d\n", __func__, event);
399
400 /* FIX . need to use CLASS-H controller */
401 switch (event) {
402 case SND_SOC_DAPM_POST_PMU:
403 snd_soc_update_bits(codec, TAIKO_A_CDC_CLK_OTHR_CTL, 0x01,
404 0x01);
405 usleep_range(200, 200);
406 snd_soc_update_bits(codec, TAIKO_A_NCP_STATIC, 0x10, 0x00);
407 break;
408 case SND_SOC_DAPM_PRE_PMD:
409 snd_soc_update_bits(codec, TAIKO_A_CDC_CLK_OTHR_RESET_B1_CTL,
410 0x01, 0x01);
411 usleep_range(20, 20);
412 snd_soc_update_bits(codec, TAIKO_A_NCP_STATIC, 0x08, 0x08);
413 snd_soc_update_bits(codec, TAIKO_A_NCP_STATIC, 0x10, 0x10);
414 snd_soc_update_bits(codec, TAIKO_A_CDC_CLK_OTHR_CTL, 0x01,
415 0x00);
416 snd_soc_update_bits(codec, TAIKO_A_NCP_STATIC, 0x08, 0x00);
417 break;
418 }
419 return 0;
420}
421
422static int taiko_get_anc_slot(struct snd_kcontrol *kcontrol,
423 struct snd_ctl_elem_value *ucontrol)
424{
425 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
426 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
427 ucontrol->value.integer.value[0] = taiko->anc_slot;
428 return 0;
429}
430
431static int taiko_put_anc_slot(struct snd_kcontrol *kcontrol,
432 struct snd_ctl_elem_value *ucontrol)
433{
434 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
435 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
436 taiko->anc_slot = ucontrol->value.integer.value[0];
437 return 0;
438}
439
440static int taiko_pa_gain_get(struct snd_kcontrol *kcontrol,
441 struct snd_ctl_elem_value *ucontrol)
442{
443 u8 ear_pa_gain;
444 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
445
446 ear_pa_gain = snd_soc_read(codec, TAIKO_A_RX_EAR_GAIN);
447
448 ear_pa_gain = ear_pa_gain >> 5;
449
450 if (ear_pa_gain == 0x00) {
451 ucontrol->value.integer.value[0] = 0;
452 } else if (ear_pa_gain == 0x04) {
453 ucontrol->value.integer.value[0] = 1;
454 } else {
455 pr_err("%s: ERROR: Unsupported Ear Gain = 0x%x\n",
456 __func__, ear_pa_gain);
457 return -EINVAL;
458 }
459
460 pr_debug("%s: ear_pa_gain = 0x%x\n", __func__, ear_pa_gain);
461
462 return 0;
463}
464
465static int taiko_pa_gain_put(struct snd_kcontrol *kcontrol,
466 struct snd_ctl_elem_value *ucontrol)
467{
468 u8 ear_pa_gain;
469 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
470
471 pr_debug("%s: ucontrol->value.integer.value[0] = %ld\n", __func__,
472 ucontrol->value.integer.value[0]);
473
474 switch (ucontrol->value.integer.value[0]) {
475 case 0:
476 ear_pa_gain = 0x00;
477 break;
478 case 1:
479 ear_pa_gain = 0x80;
480 break;
481 default:
482 return -EINVAL;
483 }
484
485 snd_soc_update_bits(codec, TAIKO_A_RX_EAR_GAIN, 0xE0, ear_pa_gain);
486 return 0;
487}
488
489static int taiko_get_iir_enable_audio_mixer(
490 struct snd_kcontrol *kcontrol,
491 struct snd_ctl_elem_value *ucontrol)
492{
493 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
494 int iir_idx = ((struct soc_multi_mixer_control *)
495 kcontrol->private_value)->reg;
496 int band_idx = ((struct soc_multi_mixer_control *)
497 kcontrol->private_value)->shift;
498
499 ucontrol->value.integer.value[0] =
500 snd_soc_read(codec, (TAIKO_A_CDC_IIR1_CTL + 16 * iir_idx)) &
501 (1 << band_idx);
502
503 pr_debug("%s: IIR #%d band #%d enable %d\n", __func__,
504 iir_idx, band_idx,
505 (uint32_t)ucontrol->value.integer.value[0]);
506 return 0;
507}
508
509static int taiko_put_iir_enable_audio_mixer(
510 struct snd_kcontrol *kcontrol,
511 struct snd_ctl_elem_value *ucontrol)
512{
513 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
514 int iir_idx = ((struct soc_multi_mixer_control *)
515 kcontrol->private_value)->reg;
516 int band_idx = ((struct soc_multi_mixer_control *)
517 kcontrol->private_value)->shift;
518 int value = ucontrol->value.integer.value[0];
519
520 /* Mask first 5 bits, 6-8 are reserved */
521 snd_soc_update_bits(codec, (TAIKO_A_CDC_IIR1_CTL + 16 * iir_idx),
522 (1 << band_idx), (value << band_idx));
523
524 pr_debug("%s: IIR #%d band #%d enable %d\n", __func__,
525 iir_idx, band_idx, value);
526 return 0;
527}
528static uint32_t get_iir_band_coeff(struct snd_soc_codec *codec,
529 int iir_idx, int band_idx,
530 int coeff_idx)
531{
532 /* Address does not automatically update if reading */
533 snd_soc_write(codec,
534 (TAIKO_A_CDC_IIR1_COEF_B1_CTL + 16 * iir_idx),
535 (band_idx * BAND_MAX + coeff_idx) & 0x1F);
536
537 /* Mask bits top 2 bits since they are reserved */
538 return ((snd_soc_read(codec,
539 (TAIKO_A_CDC_IIR1_COEF_B2_CTL + 16 * iir_idx)) << 24)) &
540 0x3FFFFFFF;
541}
542
543static int taiko_get_iir_band_audio_mixer(
544 struct snd_kcontrol *kcontrol,
545 struct snd_ctl_elem_value *ucontrol)
546{
547 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
548 int iir_idx = ((struct soc_multi_mixer_control *)
549 kcontrol->private_value)->reg;
550 int band_idx = ((struct soc_multi_mixer_control *)
551 kcontrol->private_value)->shift;
552
553 ucontrol->value.integer.value[0] =
554 get_iir_band_coeff(codec, iir_idx, band_idx, 0);
555 ucontrol->value.integer.value[1] =
556 get_iir_band_coeff(codec, iir_idx, band_idx, 1);
557 ucontrol->value.integer.value[2] =
558 get_iir_band_coeff(codec, iir_idx, band_idx, 2);
559 ucontrol->value.integer.value[3] =
560 get_iir_band_coeff(codec, iir_idx, band_idx, 3);
561 ucontrol->value.integer.value[4] =
562 get_iir_band_coeff(codec, iir_idx, band_idx, 4);
563
564 pr_debug("%s: IIR #%d band #%d b0 = 0x%x\n"
565 "%s: IIR #%d band #%d b1 = 0x%x\n"
566 "%s: IIR #%d band #%d b2 = 0x%x\n"
567 "%s: IIR #%d band #%d a1 = 0x%x\n"
568 "%s: IIR #%d band #%d a2 = 0x%x\n",
569 __func__, iir_idx, band_idx,
570 (uint32_t)ucontrol->value.integer.value[0],
571 __func__, iir_idx, band_idx,
572 (uint32_t)ucontrol->value.integer.value[1],
573 __func__, iir_idx, band_idx,
574 (uint32_t)ucontrol->value.integer.value[2],
575 __func__, iir_idx, band_idx,
576 (uint32_t)ucontrol->value.integer.value[3],
577 __func__, iir_idx, band_idx,
578 (uint32_t)ucontrol->value.integer.value[4]);
579 return 0;
580}
581
582static void set_iir_band_coeff(struct snd_soc_codec *codec,
583 int iir_idx, int band_idx,
584 int coeff_idx, uint32_t value)
585{
586 /* Mask top 3 bits, 6-8 are reserved */
587 /* Update address manually each time */
588 snd_soc_write(codec,
589 (TAIKO_A_CDC_IIR1_COEF_B1_CTL + 16 * iir_idx),
590 (band_idx * BAND_MAX + coeff_idx) & 0x1F);
591
592 /* Mask top 2 bits, 7-8 are reserved */
593 snd_soc_write(codec,
594 (TAIKO_A_CDC_IIR1_COEF_B2_CTL + 16 * iir_idx),
595 (value >> 24) & 0x3F);
596
597}
598
599static int taiko_put_iir_band_audio_mixer(
600 struct snd_kcontrol *kcontrol,
601 struct snd_ctl_elem_value *ucontrol)
602{
603 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
604 int iir_idx = ((struct soc_multi_mixer_control *)
605 kcontrol->private_value)->reg;
606 int band_idx = ((struct soc_multi_mixer_control *)
607 kcontrol->private_value)->shift;
608
609 set_iir_band_coeff(codec, iir_idx, band_idx, 0,
610 ucontrol->value.integer.value[0]);
611 set_iir_band_coeff(codec, iir_idx, band_idx, 1,
612 ucontrol->value.integer.value[1]);
613 set_iir_band_coeff(codec, iir_idx, band_idx, 2,
614 ucontrol->value.integer.value[2]);
615 set_iir_band_coeff(codec, iir_idx, band_idx, 3,
616 ucontrol->value.integer.value[3]);
617 set_iir_band_coeff(codec, iir_idx, band_idx, 4,
618 ucontrol->value.integer.value[4]);
619
620 pr_debug("%s: IIR #%d band #%d b0 = 0x%x\n"
621 "%s: IIR #%d band #%d b1 = 0x%x\n"
622 "%s: IIR #%d band #%d b2 = 0x%x\n"
623 "%s: IIR #%d band #%d a1 = 0x%x\n"
624 "%s: IIR #%d band #%d a2 = 0x%x\n",
625 __func__, iir_idx, band_idx,
626 get_iir_band_coeff(codec, iir_idx, band_idx, 0),
627 __func__, iir_idx, band_idx,
628 get_iir_band_coeff(codec, iir_idx, band_idx, 1),
629 __func__, iir_idx, band_idx,
630 get_iir_band_coeff(codec, iir_idx, band_idx, 2),
631 __func__, iir_idx, band_idx,
632 get_iir_band_coeff(codec, iir_idx, band_idx, 3),
633 __func__, iir_idx, band_idx,
634 get_iir_band_coeff(codec, iir_idx, band_idx, 4));
635 return 0;
636}
637
638static int taiko_compander_gain_offset(
639 struct snd_soc_codec *codec, u32 enable,
640 unsigned int reg, int mask, int event)
641{
642 int pa_mode = snd_soc_read(codec, reg) & mask;
643 int gain_offset = 0;
644 /* if PMU && enable is 1-> offset is 3
645 * if PMU && enable is 0-> offset is 0
646 * if PMD && pa_mode is PA -> offset is 0: PMU compander is off
647 * if PMD && pa_mode is comp -> offset is -3: PMU compander is on.
648 */
649
650 if (SND_SOC_DAPM_EVENT_ON(event) && (enable != 0))
651 gain_offset = TAIKO_COMP_DIGITAL_GAIN_OFFSET;
652 if (SND_SOC_DAPM_EVENT_OFF(event) && (pa_mode == 0))
653 gain_offset = -TAIKO_COMP_DIGITAL_GAIN_OFFSET;
654 return gain_offset;
655}
656
657
658static int taiko_config_gain_compander(
659 struct snd_soc_codec *codec,
660 u32 compander, u32 enable, int event)
661{
662 int value = 0;
663 int mask = 1 << 4;
664 int gain = 0;
665 int gain_offset;
666 if (compander >= COMPANDER_MAX) {
667 pr_err("%s: Error, invalid compander channel\n", __func__);
668 return -EINVAL;
669 }
670
671 if ((enable == 0) || SND_SOC_DAPM_EVENT_OFF(event))
672 value = 1 << 4;
673
674 if (compander == COMPANDER_1) {
675 gain_offset = taiko_compander_gain_offset(codec, enable,
676 TAIKO_A_RX_HPH_L_GAIN, mask, event);
677 snd_soc_update_bits(codec, TAIKO_A_RX_HPH_L_GAIN, mask, value);
678 gain = snd_soc_read(codec, TAIKO_A_CDC_RX1_VOL_CTL_B2_CTL);
679 snd_soc_update_bits(codec, TAIKO_A_CDC_RX1_VOL_CTL_B2_CTL,
680 0xFF, gain - gain_offset);
681 gain_offset = taiko_compander_gain_offset(codec, enable,
682 TAIKO_A_RX_HPH_R_GAIN, mask, event);
683 snd_soc_update_bits(codec, TAIKO_A_RX_HPH_R_GAIN, mask, value);
684 gain = snd_soc_read(codec, TAIKO_A_CDC_RX2_VOL_CTL_B2_CTL);
685 snd_soc_update_bits(codec, TAIKO_A_CDC_RX2_VOL_CTL_B2_CTL,
686 0xFF, gain - gain_offset);
687 } else if (compander == COMPANDER_2) {
688 gain_offset = taiko_compander_gain_offset(codec, enable,
689 TAIKO_A_RX_LINE_1_GAIN, mask, event);
690 snd_soc_update_bits(codec, TAIKO_A_RX_LINE_1_GAIN, mask, value);
691 gain = snd_soc_read(codec, TAIKO_A_CDC_RX3_VOL_CTL_B2_CTL);
692 snd_soc_update_bits(codec, TAIKO_A_CDC_RX3_VOL_CTL_B2_CTL,
693 0xFF, gain - gain_offset);
694 gain_offset = taiko_compander_gain_offset(codec, enable,
695 TAIKO_A_RX_LINE_3_GAIN, mask, event);
696 snd_soc_update_bits(codec, TAIKO_A_RX_LINE_3_GAIN, mask, value);
697 gain = snd_soc_read(codec, TAIKO_A_CDC_RX4_VOL_CTL_B2_CTL);
698 snd_soc_update_bits(codec, TAIKO_A_CDC_RX4_VOL_CTL_B2_CTL,
699 0xFF, gain - gain_offset);
700 gain_offset = taiko_compander_gain_offset(codec, enable,
701 TAIKO_A_RX_LINE_2_GAIN, mask, event);
702 snd_soc_update_bits(codec, TAIKO_A_RX_LINE_2_GAIN, mask, value);
703 gain = snd_soc_read(codec, TAIKO_A_CDC_RX5_VOL_CTL_B2_CTL);
704 snd_soc_update_bits(codec, TAIKO_A_CDC_RX5_VOL_CTL_B2_CTL,
705 0xFF, gain - gain_offset);
706 gain_offset = taiko_compander_gain_offset(codec, enable,
707 TAIKO_A_RX_LINE_4_GAIN, mask, event);
708 snd_soc_update_bits(codec, TAIKO_A_RX_LINE_4_GAIN, mask, value);
709 gain = snd_soc_read(codec, TAIKO_A_CDC_RX6_VOL_CTL_B2_CTL);
710 snd_soc_update_bits(codec, TAIKO_A_CDC_RX6_VOL_CTL_B2_CTL,
711 0xFF, gain - gain_offset);
712 }
713 return 0;
714}
715static int taiko_get_compander(struct snd_kcontrol *kcontrol,
716 struct snd_ctl_elem_value *ucontrol)
717{
718
719 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
720 int comp = ((struct soc_multi_mixer_control *)
721 kcontrol->private_value)->max;
722 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
723
724 ucontrol->value.integer.value[0] = taiko->comp_enabled[comp];
725
726 return 0;
727}
728
729static int taiko_set_compander(struct snd_kcontrol *kcontrol,
730 struct snd_ctl_elem_value *ucontrol)
731{
732 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
733 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
734 int comp = ((struct soc_multi_mixer_control *)
735 kcontrol->private_value)->max;
736 int value = ucontrol->value.integer.value[0];
737
738 if (value == taiko->comp_enabled[comp]) {
739 pr_debug("%s: compander #%d enable %d no change\n",
740 __func__, comp, value);
741 return 0;
742 }
743 taiko->comp_enabled[comp] = value;
744 return 0;
745}
746
747
748static int taiko_config_compander(struct snd_soc_dapm_widget *w,
749 struct snd_kcontrol *kcontrol,
750 int event)
751{
752 struct snd_soc_codec *codec = w->codec;
753 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
754 u32 rate = taiko->comp_fs[w->shift];
755
756 switch (event) {
757 case SND_SOC_DAPM_PRE_PMU:
758 if (taiko->comp_enabled[w->shift] != 0) {
759 /* Enable both L/R compander clocks */
760 snd_soc_update_bits(codec,
761 TAIKO_A_CDC_CLK_RX_B2_CTL,
762 0x03 << comp_shift[w->shift],
763 0x03 << comp_shift[w->shift]);
764 /* Clar the HALT for the compander*/
765 snd_soc_update_bits(codec,
766 TAIKO_A_CDC_COMP1_B1_CTL +
767 w->shift * 8, 1 << 2, 0);
768 /* Toggle compander reset bits*/
769 snd_soc_update_bits(codec,
770 TAIKO_A_CDC_CLK_OTHR_RESET_B2_CTL,
771 0x03 << comp_shift[w->shift],
772 0x03 << comp_shift[w->shift]);
773 snd_soc_update_bits(codec,
774 TAIKO_A_CDC_CLK_OTHR_RESET_B2_CTL,
775 0x03 << comp_shift[w->shift], 0);
776 taiko_config_gain_compander(codec, w->shift, 1, event);
777 /* Update the RMS meter resampling*/
778 snd_soc_update_bits(codec,
779 TAIKO_A_CDC_COMP1_B3_CTL +
780 w->shift * 8, 0xFF, 0x01);
781 /* Wait for 1ms*/
782 usleep_range(1000, 1000);
783 }
784 break;
785 case SND_SOC_DAPM_POST_PMU:
786 /* Set sample rate dependent paramater*/
787 if (taiko->comp_enabled[w->shift] != 0) {
788 snd_soc_update_bits(codec, TAIKO_A_CDC_COMP1_FS_CFG +
789 w->shift * 8, 0x03, rate);
790 snd_soc_update_bits(codec, TAIKO_A_CDC_COMP1_B2_CTL +
791 w->shift * 8, 0x0F,
792 comp_samp_params[rate].peak_det_timeout);
793 snd_soc_update_bits(codec, TAIKO_A_CDC_COMP1_B2_CTL +
794 w->shift * 8, 0xF0,
795 comp_samp_params[rate].rms_meter_div_fact);
796 snd_soc_update_bits(codec, TAIKO_A_CDC_COMP1_B3_CTL +
797 w->shift * 8, 0xFF,
798 comp_samp_params[rate].rms_meter_resamp_fact);
799 /* Compander enable -> 0x370/0x378*/
800 snd_soc_update_bits(codec, TAIKO_A_CDC_COMP1_B1_CTL +
801 w->shift * 8, 0x03, 0x03);
802 }
803 break;
804 case SND_SOC_DAPM_PRE_PMD:
805 /* Halt the compander*/
806 snd_soc_update_bits(codec, TAIKO_A_CDC_COMP1_B1_CTL +
807 w->shift * 8, 1 << 2, 1 << 2);
808 break;
809 case SND_SOC_DAPM_POST_PMD:
810 /* Restore the gain */
811 taiko_config_gain_compander(codec, w->shift,
812 taiko->comp_enabled[w->shift], event);
813 /* Disable the compander*/
814 snd_soc_update_bits(codec, TAIKO_A_CDC_COMP1_B1_CTL +
815 w->shift * 8, 0x03, 0x00);
816 /* Turn off the clock for compander in pair*/
817 snd_soc_update_bits(codec, TAIKO_A_CDC_CLK_RX_B2_CTL,
818 0x03 << comp_shift[w->shift], 0);
819 break;
820 }
821 return 0;
822}
823
824static const char * const taiko_ear_pa_gain_text[] = {"POS_6_DB", "POS_2_DB"};
825static const struct soc_enum taiko_ear_pa_gain_enum[] = {
826 SOC_ENUM_SINGLE_EXT(2, taiko_ear_pa_gain_text),
827};
828
829/*cut of frequency for high pass filter*/
830static const char * const cf_text[] = {
831 "MIN_3DB_4Hz", "MIN_3DB_75Hz", "MIN_3DB_150Hz"
832};
833
834static const struct soc_enum cf_dec1_enum =
835 SOC_ENUM_SINGLE(TAIKO_A_CDC_TX1_MUX_CTL, 4, 3, cf_text);
836
837static const struct soc_enum cf_dec2_enum =
838 SOC_ENUM_SINGLE(TAIKO_A_CDC_TX2_MUX_CTL, 4, 3, cf_text);
839
840static const struct soc_enum cf_dec3_enum =
841 SOC_ENUM_SINGLE(TAIKO_A_CDC_TX3_MUX_CTL, 4, 3, cf_text);
842
843static const struct soc_enum cf_dec4_enum =
844 SOC_ENUM_SINGLE(TAIKO_A_CDC_TX4_MUX_CTL, 4, 3, cf_text);
845
846static const struct soc_enum cf_dec5_enum =
847 SOC_ENUM_SINGLE(TAIKO_A_CDC_TX5_MUX_CTL, 4, 3, cf_text);
848
849static const struct soc_enum cf_dec6_enum =
850 SOC_ENUM_SINGLE(TAIKO_A_CDC_TX6_MUX_CTL, 4, 3, cf_text);
851
852static const struct soc_enum cf_dec7_enum =
853 SOC_ENUM_SINGLE(TAIKO_A_CDC_TX7_MUX_CTL, 4, 3, cf_text);
854
855static const struct soc_enum cf_dec8_enum =
856 SOC_ENUM_SINGLE(TAIKO_A_CDC_TX8_MUX_CTL, 4, 3, cf_text);
857
858static const struct soc_enum cf_dec9_enum =
859 SOC_ENUM_SINGLE(TAIKO_A_CDC_TX9_MUX_CTL, 4, 3, cf_text);
860
861static const struct soc_enum cf_dec10_enum =
862 SOC_ENUM_SINGLE(TAIKO_A_CDC_TX10_MUX_CTL, 4, 3, cf_text);
863
864static const struct soc_enum cf_rxmix1_enum =
865 SOC_ENUM_SINGLE(TAIKO_A_CDC_RX1_B4_CTL, 1, 3, cf_text);
866
867static const struct soc_enum cf_rxmix2_enum =
868 SOC_ENUM_SINGLE(TAIKO_A_CDC_RX2_B4_CTL, 1, 3, cf_text);
869
870static const struct soc_enum cf_rxmix3_enum =
871 SOC_ENUM_SINGLE(TAIKO_A_CDC_RX3_B4_CTL, 1, 3, cf_text);
872
873static const struct soc_enum cf_rxmix4_enum =
874 SOC_ENUM_SINGLE(TAIKO_A_CDC_RX4_B4_CTL, 1, 3, cf_text);
875
876static const struct soc_enum cf_rxmix5_enum =
877 SOC_ENUM_SINGLE(TAIKO_A_CDC_RX5_B4_CTL, 1, 3, cf_text)
878;
879static const struct soc_enum cf_rxmix6_enum =
880 SOC_ENUM_SINGLE(TAIKO_A_CDC_RX6_B4_CTL, 1, 3, cf_text);
881
882static const struct soc_enum cf_rxmix7_enum =
883 SOC_ENUM_SINGLE(TAIKO_A_CDC_RX7_B4_CTL, 1, 3, cf_text);
884
885static const struct snd_kcontrol_new taiko_snd_controls[] = {
886
887 SOC_ENUM_EXT("EAR PA Gain", taiko_ear_pa_gain_enum[0],
888 taiko_pa_gain_get, taiko_pa_gain_put),
889
890 SOC_SINGLE_TLV("LINEOUT1 Volume", TAIKO_A_RX_LINE_1_GAIN, 0, 12, 1,
891 line_gain),
892 SOC_SINGLE_TLV("LINEOUT2 Volume", TAIKO_A_RX_LINE_2_GAIN, 0, 12, 1,
893 line_gain),
894 SOC_SINGLE_TLV("LINEOUT3 Volume", TAIKO_A_RX_LINE_3_GAIN, 0, 12, 1,
895 line_gain),
896 SOC_SINGLE_TLV("LINEOUT4 Volume", TAIKO_A_RX_LINE_4_GAIN, 0, 12, 1,
897 line_gain),
898
899 SOC_SINGLE_TLV("HPHL Volume", TAIKO_A_RX_HPH_L_GAIN, 0, 12, 1,
900 line_gain),
901 SOC_SINGLE_TLV("HPHR Volume", TAIKO_A_RX_HPH_R_GAIN, 0, 12, 1,
902 line_gain),
903
904 SOC_SINGLE_S8_TLV("RX1 Digital Volume", TAIKO_A_CDC_RX1_VOL_CTL_B2_CTL,
905 -84, 40, digital_gain),
906 SOC_SINGLE_S8_TLV("RX2 Digital Volume", TAIKO_A_CDC_RX2_VOL_CTL_B2_CTL,
907 -84, 40, digital_gain),
908 SOC_SINGLE_S8_TLV("RX3 Digital Volume", TAIKO_A_CDC_RX3_VOL_CTL_B2_CTL,
909 -84, 40, digital_gain),
910 SOC_SINGLE_S8_TLV("RX4 Digital Volume", TAIKO_A_CDC_RX4_VOL_CTL_B2_CTL,
911 -84, 40, digital_gain),
912 SOC_SINGLE_S8_TLV("RX5 Digital Volume", TAIKO_A_CDC_RX5_VOL_CTL_B2_CTL,
913 -84, 40, digital_gain),
914 SOC_SINGLE_S8_TLV("RX6 Digital Volume", TAIKO_A_CDC_RX6_VOL_CTL_B2_CTL,
915 -84, 40, digital_gain),
916 SOC_SINGLE_S8_TLV("RX7 Digital Volume", TAIKO_A_CDC_RX7_VOL_CTL_B2_CTL,
917 -84, 40, digital_gain),
918
919 SOC_SINGLE_S8_TLV("DEC1 Volume", TAIKO_A_CDC_TX1_VOL_CTL_GAIN, -84, 40,
920 digital_gain),
921 SOC_SINGLE_S8_TLV("DEC2 Volume", TAIKO_A_CDC_TX2_VOL_CTL_GAIN, -84, 40,
922 digital_gain),
923 SOC_SINGLE_S8_TLV("DEC3 Volume", TAIKO_A_CDC_TX3_VOL_CTL_GAIN, -84, 40,
924 digital_gain),
925 SOC_SINGLE_S8_TLV("DEC4 Volume", TAIKO_A_CDC_TX4_VOL_CTL_GAIN, -84, 40,
926 digital_gain),
927 SOC_SINGLE_S8_TLV("DEC5 Volume", TAIKO_A_CDC_TX5_VOL_CTL_GAIN, -84, 40,
928 digital_gain),
929 SOC_SINGLE_S8_TLV("DEC6 Volume", TAIKO_A_CDC_TX6_VOL_CTL_GAIN, -84, 40,
930 digital_gain),
931 SOC_SINGLE_S8_TLV("DEC7 Volume", TAIKO_A_CDC_TX7_VOL_CTL_GAIN, -84, 40,
932 digital_gain),
933 SOC_SINGLE_S8_TLV("DEC8 Volume", TAIKO_A_CDC_TX8_VOL_CTL_GAIN, -84, 40,
934 digital_gain),
935 SOC_SINGLE_S8_TLV("DEC9 Volume", TAIKO_A_CDC_TX9_VOL_CTL_GAIN, -84, 40,
936 digital_gain),
937 SOC_SINGLE_S8_TLV("DEC10 Volume", TAIKO_A_CDC_TX10_VOL_CTL_GAIN, -84,
938 40, digital_gain),
939 SOC_SINGLE_S8_TLV("IIR1 INP1 Volume", TAIKO_A_CDC_IIR1_GAIN_B1_CTL, -84,
940 40, digital_gain),
941 SOC_SINGLE_S8_TLV("IIR1 INP2 Volume", TAIKO_A_CDC_IIR1_GAIN_B2_CTL, -84,
942 40, digital_gain),
943 SOC_SINGLE_S8_TLV("IIR1 INP3 Volume", TAIKO_A_CDC_IIR1_GAIN_B3_CTL, -84,
944 40, digital_gain),
945 SOC_SINGLE_S8_TLV("IIR1 INP4 Volume", TAIKO_A_CDC_IIR1_GAIN_B4_CTL, -84,
946 40, digital_gain),
947 SOC_SINGLE_TLV("ADC1 Volume", TAIKO_A_TX_1_2_EN, 5, 3, 0, analog_gain),
948 SOC_SINGLE_TLV("ADC2 Volume", TAIKO_A_TX_1_2_EN, 1, 3, 0, analog_gain),
949 SOC_SINGLE_TLV("ADC3 Volume", TAIKO_A_TX_3_4_EN, 5, 3, 0, analog_gain),
950 SOC_SINGLE_TLV("ADC4 Volume", TAIKO_A_TX_3_4_EN, 1, 3, 0, analog_gain),
951 SOC_SINGLE_TLV("ADC5 Volume", TAIKO_A_TX_5_6_EN, 5, 3, 0, analog_gain),
952 SOC_SINGLE_TLV("ADC6 Volume", TAIKO_A_TX_5_6_EN, 1, 3, 0, analog_gain),
953
954
955 SOC_SINGLE("MICBIAS1 CAPLESS Switch", TAIKO_A_MICB_1_CTL, 4, 1, 1),
956 SOC_SINGLE("MICBIAS2 CAPLESS Switch", TAIKO_A_MICB_2_CTL, 4, 1, 1),
957 SOC_SINGLE("MICBIAS3 CAPLESS Switch", TAIKO_A_MICB_3_CTL, 4, 1, 1),
958 SOC_SINGLE("MICBIAS4 CAPLESS Switch", TAIKO_A_MICB_4_CTL, 4, 1, 1),
959
960 SOC_SINGLE_EXT("ANC Slot", SND_SOC_NOPM, 0, 0, 100, taiko_get_anc_slot,
961 taiko_put_anc_slot),
962 SOC_ENUM("TX1 HPF cut off", cf_dec1_enum),
963 SOC_ENUM("TX2 HPF cut off", cf_dec2_enum),
964 SOC_ENUM("TX3 HPF cut off", cf_dec3_enum),
965 SOC_ENUM("TX4 HPF cut off", cf_dec4_enum),
966 SOC_ENUM("TX5 HPF cut off", cf_dec5_enum),
967 SOC_ENUM("TX6 HPF cut off", cf_dec6_enum),
968 SOC_ENUM("TX7 HPF cut off", cf_dec7_enum),
969 SOC_ENUM("TX8 HPF cut off", cf_dec8_enum),
970 SOC_ENUM("TX9 HPF cut off", cf_dec9_enum),
971 SOC_ENUM("TX10 HPF cut off", cf_dec10_enum),
972
973 SOC_SINGLE("TX1 HPF Switch", TAIKO_A_CDC_TX1_MUX_CTL, 3, 1, 0),
974 SOC_SINGLE("TX2 HPF Switch", TAIKO_A_CDC_TX2_MUX_CTL, 3, 1, 0),
975 SOC_SINGLE("TX3 HPF Switch", TAIKO_A_CDC_TX3_MUX_CTL, 3, 1, 0),
976 SOC_SINGLE("TX4 HPF Switch", TAIKO_A_CDC_TX4_MUX_CTL, 3, 1, 0),
977 SOC_SINGLE("TX5 HPF Switch", TAIKO_A_CDC_TX5_MUX_CTL, 3, 1, 0),
978 SOC_SINGLE("TX6 HPF Switch", TAIKO_A_CDC_TX6_MUX_CTL, 3, 1, 0),
979 SOC_SINGLE("TX7 HPF Switch", TAIKO_A_CDC_TX7_MUX_CTL, 3, 1, 0),
980 SOC_SINGLE("TX8 HPF Switch", TAIKO_A_CDC_TX8_MUX_CTL, 3, 1, 0),
981 SOC_SINGLE("TX9 HPF Switch", TAIKO_A_CDC_TX9_MUX_CTL, 3, 1, 0),
982 SOC_SINGLE("TX10 HPF Switch", TAIKO_A_CDC_TX10_MUX_CTL, 3, 1, 0),
983
984 SOC_SINGLE("RX1 HPF Switch", TAIKO_A_CDC_RX1_B5_CTL, 2, 1, 0),
985 SOC_SINGLE("RX2 HPF Switch", TAIKO_A_CDC_RX2_B5_CTL, 2, 1, 0),
986 SOC_SINGLE("RX3 HPF Switch", TAIKO_A_CDC_RX3_B5_CTL, 2, 1, 0),
987 SOC_SINGLE("RX4 HPF Switch", TAIKO_A_CDC_RX4_B5_CTL, 2, 1, 0),
988 SOC_SINGLE("RX5 HPF Switch", TAIKO_A_CDC_RX5_B5_CTL, 2, 1, 0),
989 SOC_SINGLE("RX6 HPF Switch", TAIKO_A_CDC_RX6_B5_CTL, 2, 1, 0),
990 SOC_SINGLE("RX7 HPF Switch", TAIKO_A_CDC_RX7_B5_CTL, 2, 1, 0),
991
992 SOC_ENUM("RX1 HPF cut off", cf_rxmix1_enum),
993 SOC_ENUM("RX2 HPF cut off", cf_rxmix2_enum),
994 SOC_ENUM("RX3 HPF cut off", cf_rxmix3_enum),
995 SOC_ENUM("RX4 HPF cut off", cf_rxmix4_enum),
996 SOC_ENUM("RX5 HPF cut off", cf_rxmix5_enum),
997 SOC_ENUM("RX6 HPF cut off", cf_rxmix6_enum),
998 SOC_ENUM("RX7 HPF cut off", cf_rxmix7_enum),
999
1000 SOC_SINGLE_EXT("IIR1 Enable Band1", IIR1, BAND1, 1, 0,
1001 taiko_get_iir_enable_audio_mixer, taiko_put_iir_enable_audio_mixer),
1002 SOC_SINGLE_EXT("IIR1 Enable Band2", IIR1, BAND2, 1, 0,
1003 taiko_get_iir_enable_audio_mixer, taiko_put_iir_enable_audio_mixer),
1004 SOC_SINGLE_EXT("IIR1 Enable Band3", IIR1, BAND3, 1, 0,
1005 taiko_get_iir_enable_audio_mixer, taiko_put_iir_enable_audio_mixer),
1006 SOC_SINGLE_EXT("IIR1 Enable Band4", IIR1, BAND4, 1, 0,
1007 taiko_get_iir_enable_audio_mixer, taiko_put_iir_enable_audio_mixer),
1008 SOC_SINGLE_EXT("IIR1 Enable Band5", IIR1, BAND5, 1, 0,
1009 taiko_get_iir_enable_audio_mixer, taiko_put_iir_enable_audio_mixer),
1010 SOC_SINGLE_EXT("IIR2 Enable Band1", IIR2, BAND1, 1, 0,
1011 taiko_get_iir_enable_audio_mixer, taiko_put_iir_enable_audio_mixer),
1012 SOC_SINGLE_EXT("IIR2 Enable Band2", IIR2, BAND2, 1, 0,
1013 taiko_get_iir_enable_audio_mixer, taiko_put_iir_enable_audio_mixer),
1014 SOC_SINGLE_EXT("IIR2 Enable Band3", IIR2, BAND3, 1, 0,
1015 taiko_get_iir_enable_audio_mixer, taiko_put_iir_enable_audio_mixer),
1016 SOC_SINGLE_EXT("IIR2 Enable Band4", IIR2, BAND4, 1, 0,
1017 taiko_get_iir_enable_audio_mixer, taiko_put_iir_enable_audio_mixer),
1018 SOC_SINGLE_EXT("IIR2 Enable Band5", IIR2, BAND5, 1, 0,
1019 taiko_get_iir_enable_audio_mixer, taiko_put_iir_enable_audio_mixer),
1020
1021 SOC_SINGLE_MULTI_EXT("IIR1 Band1", IIR1, BAND1, 255, 0, 5,
1022 taiko_get_iir_band_audio_mixer, taiko_put_iir_band_audio_mixer),
1023 SOC_SINGLE_MULTI_EXT("IIR1 Band2", IIR1, BAND2, 255, 0, 5,
1024 taiko_get_iir_band_audio_mixer, taiko_put_iir_band_audio_mixer),
1025 SOC_SINGLE_MULTI_EXT("IIR1 Band3", IIR1, BAND3, 255, 0, 5,
1026 taiko_get_iir_band_audio_mixer, taiko_put_iir_band_audio_mixer),
1027 SOC_SINGLE_MULTI_EXT("IIR1 Band4", IIR1, BAND4, 255, 0, 5,
1028 taiko_get_iir_band_audio_mixer, taiko_put_iir_band_audio_mixer),
1029 SOC_SINGLE_MULTI_EXT("IIR1 Band5", IIR1, BAND5, 255, 0, 5,
1030 taiko_get_iir_band_audio_mixer, taiko_put_iir_band_audio_mixer),
1031 SOC_SINGLE_MULTI_EXT("IIR2 Band1", IIR2, BAND1, 255, 0, 5,
1032 taiko_get_iir_band_audio_mixer, taiko_put_iir_band_audio_mixer),
1033 SOC_SINGLE_MULTI_EXT("IIR2 Band2", IIR2, BAND2, 255, 0, 5,
1034 taiko_get_iir_band_audio_mixer, taiko_put_iir_band_audio_mixer),
1035 SOC_SINGLE_MULTI_EXT("IIR2 Band3", IIR2, BAND3, 255, 0, 5,
1036 taiko_get_iir_band_audio_mixer, taiko_put_iir_band_audio_mixer),
1037 SOC_SINGLE_MULTI_EXT("IIR2 Band4", IIR2, BAND4, 255, 0, 5,
1038 taiko_get_iir_band_audio_mixer, taiko_put_iir_band_audio_mixer),
1039 SOC_SINGLE_MULTI_EXT("IIR2 Band5", IIR2, BAND5, 255, 0, 5,
1040 taiko_get_iir_band_audio_mixer, taiko_put_iir_band_audio_mixer),
1041
1042 SOC_SINGLE_EXT("COMP1 Switch", SND_SOC_NOPM, 1, COMPANDER_1, 0,
1043 taiko_get_compander, taiko_set_compander),
1044 SOC_SINGLE_EXT("COMP2 Switch", SND_SOC_NOPM, 0, COMPANDER_2, 0,
1045 taiko_get_compander, taiko_set_compander),
1046
1047};
1048
1049static const char * const rx_mix1_text[] = {
1050 "ZERO", "SRC1", "SRC2", "IIR1", "IIR2", "RX1", "RX2", "RX3", "RX4",
1051 "RX5", "RX6", "RX7"
1052};
1053
1054static const char * const rx_mix2_text[] = {
1055 "ZERO", "SRC1", "SRC2", "IIR1", "IIR2"
1056};
1057
1058static const char * const rx_dsm_text[] = {
1059 "CIC_OUT", "DSM_INV"
1060};
1061
1062static const char * const sb_tx1_mux_text[] = {
1063 "ZERO", "RMIX1", "RMIX2", "RMIX3", "RMIX4", "RMIX5", "RMIX6", "RMIX7",
1064 "DEC1"
1065};
1066
1067static const char * const sb_tx2_mux_text[] = {
1068 "ZERO", "RMIX1", "RMIX2", "RMIX3", "RMIX4", "RMIX5", "RMIX6", "RMIX7",
1069 "DEC2"
1070};
1071
1072static const char * const sb_tx3_mux_text[] = {
1073 "ZERO", "RMIX1", "RMIX2", "RMIX3", "RMIX4", "RMIX5", "RMIX6", "RMIX7",
1074 "DEC3"
1075};
1076
1077static const char * const sb_tx4_mux_text[] = {
1078 "ZERO", "RMIX1", "RMIX2", "RMIX3", "RMIX4", "RMIX5", "RMIX6", "RMIX7",
1079 "DEC4"
1080};
1081
1082static const char * const sb_tx5_mux_text[] = {
1083 "ZERO", "RMIX1", "RMIX2", "RMIX3", "RMIX4", "RMIX5", "RMIX6", "RMIX7",
1084 "DEC5"
1085};
1086
1087static const char * const sb_tx6_mux_text[] = {
1088 "ZERO", "RMIX1", "RMIX2", "RMIX3", "RMIX4", "RMIX5", "RMIX6", "RMIX7",
1089 "DEC6"
1090};
1091
1092static const char * const sb_tx7_to_tx10_mux_text[] = {
1093 "ZERO", "RMIX1", "RMIX2", "RMIX3", "RMIX4", "RMIX5", "RMIX6", "RMIX7",
1094 "DEC1", "DEC2", "DEC3", "DEC4", "DEC5", "DEC6", "DEC7", "DEC8",
1095 "DEC9", "DEC10"
1096};
1097
1098static const char * const dec1_mux_text[] = {
1099 "ZERO", "DMIC1", "ADC6",
1100};
1101
1102static const char * const dec2_mux_text[] = {
1103 "ZERO", "DMIC2", "ADC5",
1104};
1105
1106static const char * const dec3_mux_text[] = {
1107 "ZERO", "DMIC3", "ADC4",
1108};
1109
1110static const char * const dec4_mux_text[] = {
1111 "ZERO", "DMIC4", "ADC3",
1112};
1113
1114static const char * const dec5_mux_text[] = {
1115 "ZERO", "DMIC5", "ADC2",
1116};
1117
1118static const char * const dec6_mux_text[] = {
1119 "ZERO", "DMIC6", "ADC1",
1120};
1121
1122static const char * const dec7_mux_text[] = {
1123 "ZERO", "DMIC1", "DMIC6", "ADC1", "ADC6", "ANC1_FB", "ANC2_FB",
1124};
1125
1126static const char * const dec8_mux_text[] = {
1127 "ZERO", "DMIC2", "DMIC5", "ADC2", "ADC5",
1128};
1129
1130static const char * const dec9_mux_text[] = {
1131 "ZERO", "DMIC4", "DMIC5", "ADC2", "ADC3", "ADCMB", "ANC1_FB", "ANC2_FB",
1132};
1133
1134static const char * const dec10_mux_text[] = {
1135 "ZERO", "DMIC3", "DMIC6", "ADC1", "ADC4", "ADCMB", "ANC1_FB", "ANC2_FB",
1136};
1137
1138static const char * const anc_mux_text[] = {
1139 "ZERO", "ADC1", "ADC2", "ADC3", "ADC4", "ADC5", "ADC6", "ADC_MB",
1140 "RSVD_1", "DMIC1", "DMIC2", "DMIC3", "DMIC4", "DMIC5", "DMIC6"
1141};
1142
1143static const char * const anc1_fb_mux_text[] = {
1144 "ZERO", "EAR_HPH_L", "EAR_LINE_1",
1145};
1146
1147static const char * const iir1_inp1_text[] = {
1148 "ZERO", "DEC1", "DEC2", "DEC3", "DEC4", "DEC5", "DEC6", "DEC7", "DEC8",
1149 "DEC9", "DEC10", "RX1", "RX2", "RX3", "RX4", "RX5", "RX6", "RX7"
1150};
1151
1152static const struct soc_enum rx_mix1_inp1_chain_enum =
1153 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX1_B1_CTL, 0, 12, rx_mix1_text);
1154
1155static const struct soc_enum rx_mix1_inp2_chain_enum =
1156 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX1_B1_CTL, 4, 12, rx_mix1_text);
1157
1158static const struct soc_enum rx_mix1_inp3_chain_enum =
1159 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX1_B2_CTL, 0, 12, rx_mix1_text);
1160
1161static const struct soc_enum rx2_mix1_inp1_chain_enum =
1162 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX2_B1_CTL, 0, 12, rx_mix1_text);
1163
1164static const struct soc_enum rx2_mix1_inp2_chain_enum =
1165 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX2_B1_CTL, 4, 12, rx_mix1_text);
1166
1167static const struct soc_enum rx3_mix1_inp1_chain_enum =
1168 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX3_B1_CTL, 0, 12, rx_mix1_text);
1169
1170static const struct soc_enum rx3_mix1_inp2_chain_enum =
1171 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX3_B1_CTL, 4, 12, rx_mix1_text);
1172
1173static const struct soc_enum rx4_mix1_inp1_chain_enum =
1174 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX4_B1_CTL, 0, 12, rx_mix1_text);
1175
1176static const struct soc_enum rx4_mix1_inp2_chain_enum =
1177 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX4_B1_CTL, 4, 12, rx_mix1_text);
1178
1179static const struct soc_enum rx5_mix1_inp1_chain_enum =
1180 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX5_B1_CTL, 0, 12, rx_mix1_text);
1181
1182static const struct soc_enum rx5_mix1_inp2_chain_enum =
1183 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX5_B1_CTL, 4, 12, rx_mix1_text);
1184
1185static const struct soc_enum rx6_mix1_inp1_chain_enum =
1186 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX6_B1_CTL, 0, 12, rx_mix1_text);
1187
1188static const struct soc_enum rx6_mix1_inp2_chain_enum =
1189 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX6_B1_CTL, 4, 12, rx_mix1_text);
1190
1191static const struct soc_enum rx7_mix1_inp1_chain_enum =
1192 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX7_B1_CTL, 0, 12, rx_mix1_text);
1193
1194static const struct soc_enum rx7_mix1_inp2_chain_enum =
1195 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX7_B1_CTL, 4, 12, rx_mix1_text);
1196
1197static const struct soc_enum rx1_mix2_inp1_chain_enum =
1198 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX1_B3_CTL, 0, 5, rx_mix2_text);
1199
1200static const struct soc_enum rx1_mix2_inp2_chain_enum =
1201 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX1_B3_CTL, 3, 5, rx_mix2_text);
1202
1203static const struct soc_enum rx2_mix2_inp1_chain_enum =
1204 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX2_B3_CTL, 0, 5, rx_mix2_text);
1205
1206static const struct soc_enum rx2_mix2_inp2_chain_enum =
1207 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX2_B3_CTL, 3, 5, rx_mix2_text);
1208
1209static const struct soc_enum rx7_mix2_inp1_chain_enum =
1210 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX7_B3_CTL, 0, 5, rx_mix2_text);
1211
1212static const struct soc_enum rx7_mix2_inp2_chain_enum =
1213 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_RX7_B3_CTL, 3, 5, rx_mix2_text);
1214
1215static const struct soc_enum rx4_dsm_enum =
1216 SOC_ENUM_SINGLE(TAIKO_A_CDC_RX4_B6_CTL, 4, 2, rx_dsm_text);
1217
1218static const struct soc_enum rx6_dsm_enum =
1219 SOC_ENUM_SINGLE(TAIKO_A_CDC_RX6_B6_CTL, 4, 2, rx_dsm_text);
1220
1221static const struct soc_enum sb_tx1_mux_enum =
1222 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_SB_B1_CTL, 0, 9, sb_tx1_mux_text);
1223
1224static const struct soc_enum sb_tx2_mux_enum =
1225 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_SB_B2_CTL, 0, 9, sb_tx2_mux_text);
1226
1227static const struct soc_enum sb_tx3_mux_enum =
1228 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_SB_B3_CTL, 0, 9, sb_tx3_mux_text);
1229
1230static const struct soc_enum sb_tx4_mux_enum =
1231 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_SB_B4_CTL, 0, 9, sb_tx4_mux_text);
1232
1233static const struct soc_enum sb_tx5_mux_enum =
1234 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_SB_B5_CTL, 0, 9, sb_tx5_mux_text);
1235
1236static const struct soc_enum sb_tx6_mux_enum =
1237 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_SB_B6_CTL, 0, 9, sb_tx6_mux_text);
1238
1239static const struct soc_enum sb_tx7_mux_enum =
1240 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_SB_B7_CTL, 0, 18,
1241 sb_tx7_to_tx10_mux_text);
1242
1243static const struct soc_enum sb_tx8_mux_enum =
1244 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_SB_B8_CTL, 0, 18,
1245 sb_tx7_to_tx10_mux_text);
1246
1247static const struct soc_enum sb_tx9_mux_enum =
1248 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_SB_B9_CTL, 0, 18,
1249 sb_tx7_to_tx10_mux_text);
1250
1251static const struct soc_enum sb_tx10_mux_enum =
1252 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_SB_B10_CTL, 0, 18,
1253 sb_tx7_to_tx10_mux_text);
1254
1255static const struct soc_enum dec1_mux_enum =
1256 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_B1_CTL, 0, 3, dec1_mux_text);
1257
1258static const struct soc_enum dec2_mux_enum =
1259 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_B1_CTL, 2, 3, dec2_mux_text);
1260
1261static const struct soc_enum dec3_mux_enum =
1262 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_B1_CTL, 4, 3, dec3_mux_text);
1263
1264static const struct soc_enum dec4_mux_enum =
1265 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_B1_CTL, 6, 3, dec4_mux_text);
1266
1267static const struct soc_enum dec5_mux_enum =
1268 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_B2_CTL, 0, 3, dec5_mux_text);
1269
1270static const struct soc_enum dec6_mux_enum =
1271 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_B2_CTL, 2, 3, dec6_mux_text);
1272
1273static const struct soc_enum dec7_mux_enum =
1274 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_B2_CTL, 4, 7, dec7_mux_text);
1275
1276static const struct soc_enum dec8_mux_enum =
1277 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_B3_CTL, 0, 7, dec8_mux_text);
1278
1279static const struct soc_enum dec9_mux_enum =
1280 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_B3_CTL, 3, 8, dec9_mux_text);
1281
1282static const struct soc_enum dec10_mux_enum =
1283 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_TX_B4_CTL, 0, 8, dec10_mux_text);
1284
1285static const struct soc_enum anc1_mux_enum =
1286 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_ANC_B1_CTL, 0, 16, anc_mux_text);
1287
1288static const struct soc_enum anc2_mux_enum =
1289 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_ANC_B1_CTL, 4, 16, anc_mux_text);
1290
1291static const struct soc_enum anc1_fb_mux_enum =
1292 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_ANC_B2_CTL, 0, 3, anc1_fb_mux_text);
1293
1294static const struct soc_enum iir1_inp1_mux_enum =
1295 SOC_ENUM_SINGLE(TAIKO_A_CDC_CONN_EQ1_B1_CTL, 0, 18, iir1_inp1_text);
1296
1297static const struct snd_kcontrol_new rx_mix1_inp1_mux =
1298 SOC_DAPM_ENUM("RX1 MIX1 INP1 Mux", rx_mix1_inp1_chain_enum);
1299
1300static const struct snd_kcontrol_new rx_mix1_inp2_mux =
1301 SOC_DAPM_ENUM("RX1 MIX1 INP2 Mux", rx_mix1_inp2_chain_enum);
1302
1303static const struct snd_kcontrol_new rx_mix1_inp3_mux =
1304 SOC_DAPM_ENUM("RX1 MIX1 INP3 Mux", rx_mix1_inp3_chain_enum);
1305
1306static const struct snd_kcontrol_new rx2_mix1_inp1_mux =
1307 SOC_DAPM_ENUM("RX2 MIX1 INP1 Mux", rx2_mix1_inp1_chain_enum);
1308
1309static const struct snd_kcontrol_new rx2_mix1_inp2_mux =
1310 SOC_DAPM_ENUM("RX2 MIX1 INP2 Mux", rx2_mix1_inp2_chain_enum);
1311
1312static const struct snd_kcontrol_new rx3_mix1_inp1_mux =
1313 SOC_DAPM_ENUM("RX3 MIX1 INP1 Mux", rx3_mix1_inp1_chain_enum);
1314
1315static const struct snd_kcontrol_new rx3_mix1_inp2_mux =
1316 SOC_DAPM_ENUM("RX3 MIX1 INP2 Mux", rx3_mix1_inp2_chain_enum);
1317
1318static const struct snd_kcontrol_new rx4_mix1_inp1_mux =
1319 SOC_DAPM_ENUM("RX4 MIX1 INP1 Mux", rx4_mix1_inp1_chain_enum);
1320
1321static const struct snd_kcontrol_new rx4_mix1_inp2_mux =
1322 SOC_DAPM_ENUM("RX4 MIX1 INP2 Mux", rx4_mix1_inp2_chain_enum);
1323
1324static const struct snd_kcontrol_new rx5_mix1_inp1_mux =
1325 SOC_DAPM_ENUM("RX5 MIX1 INP1 Mux", rx5_mix1_inp1_chain_enum);
1326
1327static const struct snd_kcontrol_new rx5_mix1_inp2_mux =
1328 SOC_DAPM_ENUM("RX5 MIX1 INP2 Mux", rx5_mix1_inp2_chain_enum);
1329
1330static const struct snd_kcontrol_new rx6_mix1_inp1_mux =
1331 SOC_DAPM_ENUM("RX6 MIX1 INP1 Mux", rx6_mix1_inp1_chain_enum);
1332
1333static const struct snd_kcontrol_new rx6_mix1_inp2_mux =
1334 SOC_DAPM_ENUM("RX6 MIX1 INP2 Mux", rx6_mix1_inp2_chain_enum);
1335
1336static const struct snd_kcontrol_new rx7_mix1_inp1_mux =
1337 SOC_DAPM_ENUM("RX7 MIX1 INP1 Mux", rx7_mix1_inp1_chain_enum);
1338
1339static const struct snd_kcontrol_new rx7_mix1_inp2_mux =
1340 SOC_DAPM_ENUM("RX7 MIX1 INP2 Mux", rx7_mix1_inp2_chain_enum);
1341
1342static const struct snd_kcontrol_new rx1_mix2_inp1_mux =
1343 SOC_DAPM_ENUM("RX1 MIX2 INP1 Mux", rx1_mix2_inp1_chain_enum);
1344
1345static const struct snd_kcontrol_new rx1_mix2_inp2_mux =
1346 SOC_DAPM_ENUM("RX1 MIX2 INP2 Mux", rx1_mix2_inp2_chain_enum);
1347
1348static const struct snd_kcontrol_new rx2_mix2_inp1_mux =
1349 SOC_DAPM_ENUM("RX2 MIX2 INP1 Mux", rx2_mix2_inp1_chain_enum);
1350
1351static const struct snd_kcontrol_new rx2_mix2_inp2_mux =
1352 SOC_DAPM_ENUM("RX2 MIX2 INP2 Mux", rx2_mix2_inp2_chain_enum);
1353
1354static const struct snd_kcontrol_new rx7_mix2_inp1_mux =
1355 SOC_DAPM_ENUM("RX7 MIX2 INP1 Mux", rx7_mix2_inp1_chain_enum);
1356
1357static const struct snd_kcontrol_new rx7_mix2_inp2_mux =
1358 SOC_DAPM_ENUM("RX7 MIX2 INP2 Mux", rx7_mix2_inp2_chain_enum);
1359
1360static const struct snd_kcontrol_new rx4_dsm_mux =
1361 SOC_DAPM_ENUM("RX4 DSM MUX Mux", rx4_dsm_enum);
1362
1363static const struct snd_kcontrol_new rx6_dsm_mux =
1364 SOC_DAPM_ENUM("RX6 DSM MUX Mux", rx6_dsm_enum);
1365
1366static const struct snd_kcontrol_new sb_tx1_mux =
1367 SOC_DAPM_ENUM("SLIM TX1 MUX Mux", sb_tx1_mux_enum);
1368
1369static const struct snd_kcontrol_new sb_tx2_mux =
1370 SOC_DAPM_ENUM("SLIM TX2 MUX Mux", sb_tx2_mux_enum);
1371
1372static const struct snd_kcontrol_new sb_tx3_mux =
1373 SOC_DAPM_ENUM("SLIM TX3 MUX Mux", sb_tx3_mux_enum);
1374
1375static const struct snd_kcontrol_new sb_tx4_mux =
1376 SOC_DAPM_ENUM("SLIM TX4 MUX Mux", sb_tx4_mux_enum);
1377
1378static const struct snd_kcontrol_new sb_tx5_mux =
1379 SOC_DAPM_ENUM("SLIM TX5 MUX Mux", sb_tx5_mux_enum);
1380
1381static const struct snd_kcontrol_new sb_tx6_mux =
1382 SOC_DAPM_ENUM("SLIM TX6 MUX Mux", sb_tx6_mux_enum);
1383
1384static const struct snd_kcontrol_new sb_tx7_mux =
1385 SOC_DAPM_ENUM("SLIM TX7 MUX Mux", sb_tx7_mux_enum);
1386
1387static const struct snd_kcontrol_new sb_tx8_mux =
1388 SOC_DAPM_ENUM("SLIM TX8 MUX Mux", sb_tx8_mux_enum);
1389
1390static const struct snd_kcontrol_new sb_tx9_mux =
1391 SOC_DAPM_ENUM("SLIM TX9 MUX Mux", sb_tx9_mux_enum);
1392
1393static const struct snd_kcontrol_new sb_tx10_mux =
1394 SOC_DAPM_ENUM("SLIM TX10 MUX Mux", sb_tx10_mux_enum);
1395
1396
1397static int wcd9320_put_dec_enum(struct snd_kcontrol *kcontrol,
1398 struct snd_ctl_elem_value *ucontrol)
1399{
1400 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
1401 struct snd_soc_dapm_widget *w = wlist->widgets[0];
1402 struct snd_soc_codec *codec = w->codec;
1403 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1404 unsigned int dec_mux, decimator;
1405 char *dec_name = NULL;
1406 char *widget_name = NULL;
1407 char *temp;
1408 u16 tx_mux_ctl_reg;
1409 u8 adc_dmic_sel = 0x0;
1410 int ret = 0;
1411
1412 if (ucontrol->value.enumerated.item[0] > e->max - 1)
1413 return -EINVAL;
1414
1415 dec_mux = ucontrol->value.enumerated.item[0];
1416
1417 widget_name = kstrndup(w->name, 15, GFP_KERNEL);
1418 if (!widget_name)
1419 return -ENOMEM;
1420 temp = widget_name;
1421
1422 dec_name = strsep(&widget_name, " ");
1423 widget_name = temp;
1424 if (!dec_name) {
1425 pr_err("%s: Invalid decimator = %s\n", __func__, w->name);
1426 ret = -EINVAL;
1427 goto out;
1428 }
1429
1430 ret = kstrtouint(strpbrk(dec_name, "123456789"), 10, &decimator);
1431 if (ret < 0) {
1432 pr_err("%s: Invalid decimator = %s\n", __func__, dec_name);
1433 ret = -EINVAL;
1434 goto out;
1435 }
1436
1437 dev_dbg(w->dapm->dev, "%s(): widget = %s decimator = %u dec_mux = %u\n"
1438 , __func__, w->name, decimator, dec_mux);
1439
1440
1441 switch (decimator) {
1442 case 1:
1443 case 2:
1444 case 3:
1445 case 4:
1446 case 5:
1447 case 6:
1448 if (dec_mux == 1)
1449 adc_dmic_sel = 0x1;
1450 else
1451 adc_dmic_sel = 0x0;
1452 break;
1453 case 7:
1454 case 8:
1455 case 9:
1456 case 10:
1457 if ((dec_mux == 1) || (dec_mux == 2))
1458 adc_dmic_sel = 0x1;
1459 else
1460 adc_dmic_sel = 0x0;
1461 break;
1462 default:
1463 pr_err("%s: Invalid Decimator = %u\n", __func__, decimator);
1464 ret = -EINVAL;
1465 goto out;
1466 }
1467
1468 tx_mux_ctl_reg = TAIKO_A_CDC_TX1_MUX_CTL + 8 * (decimator - 1);
1469
1470 snd_soc_update_bits(codec, tx_mux_ctl_reg, 0x1, adc_dmic_sel);
1471
1472 ret = snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
1473
1474out:
1475 kfree(widget_name);
1476 return ret;
1477}
1478
1479#define WCD9320_DEC_ENUM(xname, xenum) \
1480{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
1481 .info = snd_soc_info_enum_double, \
1482 .get = snd_soc_dapm_get_enum_double, \
1483 .put = wcd9320_put_dec_enum, \
1484 .private_value = (unsigned long)&xenum }
1485
1486static const struct snd_kcontrol_new dec1_mux =
1487 WCD9320_DEC_ENUM("DEC1 MUX Mux", dec1_mux_enum);
1488
1489static const struct snd_kcontrol_new dec2_mux =
1490 WCD9320_DEC_ENUM("DEC2 MUX Mux", dec2_mux_enum);
1491
1492static const struct snd_kcontrol_new dec3_mux =
1493 WCD9320_DEC_ENUM("DEC3 MUX Mux", dec3_mux_enum);
1494
1495static const struct snd_kcontrol_new dec4_mux =
1496 WCD9320_DEC_ENUM("DEC4 MUX Mux", dec4_mux_enum);
1497
1498static const struct snd_kcontrol_new dec5_mux =
1499 WCD9320_DEC_ENUM("DEC5 MUX Mux", dec5_mux_enum);
1500
1501static const struct snd_kcontrol_new dec6_mux =
1502 WCD9320_DEC_ENUM("DEC6 MUX Mux", dec6_mux_enum);
1503
1504static const struct snd_kcontrol_new dec7_mux =
1505 WCD9320_DEC_ENUM("DEC7 MUX Mux", dec7_mux_enum);
1506
1507static const struct snd_kcontrol_new dec8_mux =
1508 WCD9320_DEC_ENUM("DEC8 MUX Mux", dec8_mux_enum);
1509
1510static const struct snd_kcontrol_new dec9_mux =
1511 WCD9320_DEC_ENUM("DEC9 MUX Mux", dec9_mux_enum);
1512
1513static const struct snd_kcontrol_new dec10_mux =
1514 WCD9320_DEC_ENUM("DEC10 MUX Mux", dec10_mux_enum);
1515
1516static const struct snd_kcontrol_new iir1_inp1_mux =
1517 SOC_DAPM_ENUM("IIR1 INP1 Mux", iir1_inp1_mux_enum);
1518
1519static const struct snd_kcontrol_new anc1_mux =
1520 SOC_DAPM_ENUM("ANC1 MUX Mux", anc1_mux_enum);
1521
1522static const struct snd_kcontrol_new anc2_mux =
1523 SOC_DAPM_ENUM("ANC2 MUX Mux", anc2_mux_enum);
1524
1525static const struct snd_kcontrol_new anc1_fb_mux =
1526 SOC_DAPM_ENUM("ANC1 FB MUX Mux", anc1_fb_mux_enum);
1527
1528static const struct snd_kcontrol_new dac1_switch[] = {
1529 SOC_DAPM_SINGLE("Switch", TAIKO_A_RX_EAR_EN, 5, 1, 0)
1530};
1531static const struct snd_kcontrol_new hphl_switch[] = {
1532 SOC_DAPM_SINGLE("Switch", TAIKO_A_RX_HPH_L_DAC_CTL, 6, 1, 0)
1533};
1534
1535static const struct snd_kcontrol_new hphl_pa_mix[] = {
1536 SOC_DAPM_SINGLE("AUX_PGA_L Switch", TAIKO_A_RX_PA_AUX_IN_CONN,
1537 7, 1, 0),
1538};
1539
1540static const struct snd_kcontrol_new hphr_pa_mix[] = {
1541 SOC_DAPM_SINGLE("AUX_PGA_R Switch", TAIKO_A_RX_PA_AUX_IN_CONN,
1542 6, 1, 0),
1543};
1544
1545static const struct snd_kcontrol_new ear_pa_mix[] = {
1546 SOC_DAPM_SINGLE("AUX_PGA_L Switch", TAIKO_A_RX_PA_AUX_IN_CONN,
1547 5, 1, 0),
1548};
1549static const struct snd_kcontrol_new lineout1_pa_mix[] = {
1550 SOC_DAPM_SINGLE("AUX_PGA_L Switch", TAIKO_A_RX_PA_AUX_IN_CONN,
1551 4, 1, 0),
1552};
1553
1554static const struct snd_kcontrol_new lineout2_pa_mix[] = {
1555 SOC_DAPM_SINGLE("AUX_PGA_R Switch", TAIKO_A_RX_PA_AUX_IN_CONN,
1556 3, 1, 0),
1557};
1558
1559static const struct snd_kcontrol_new lineout3_pa_mix[] = {
1560 SOC_DAPM_SINGLE("AUX_PGA_L Switch", TAIKO_A_RX_PA_AUX_IN_CONN,
1561 2, 1, 0),
1562};
1563
1564static const struct snd_kcontrol_new lineout4_pa_mix[] = {
1565 SOC_DAPM_SINGLE("AUX_PGA_R Switch", TAIKO_A_RX_PA_AUX_IN_CONN,
1566 1, 1, 0),
1567};
1568
1569static const struct snd_kcontrol_new lineout3_ground_switch =
1570 SOC_DAPM_SINGLE("Switch", TAIKO_A_RX_LINE_3_DAC_CTL, 6, 1, 0);
1571
1572static const struct snd_kcontrol_new lineout4_ground_switch =
1573 SOC_DAPM_SINGLE("Switch", TAIKO_A_RX_LINE_4_DAC_CTL, 6, 1, 0);
1574
1575static void taiko_codec_enable_adc_block(struct snd_soc_codec *codec,
1576 int enable)
1577{
1578 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
1579
1580 pr_debug("%s %d\n", __func__, enable);
1581
1582 if (enable) {
1583 taiko->adc_count++;
1584 snd_soc_update_bits(codec, TAIKO_A_CDC_CLK_OTHR_CTL, 0x2, 0x2);
1585 } else {
1586 taiko->adc_count--;
1587 if (!taiko->adc_count)
1588 snd_soc_update_bits(codec, TAIKO_A_CDC_CLK_OTHR_CTL,
1589 0x2, 0x0);
1590 }
1591}
1592
1593static int taiko_codec_enable_adc(struct snd_soc_dapm_widget *w,
1594 struct snd_kcontrol *kcontrol, int event)
1595{
1596 struct snd_soc_codec *codec = w->codec;
1597 u16 adc_reg;
1598 u8 init_bit_shift;
1599
1600 pr_debug("%s %d\n", __func__, event);
1601
1602 if (w->reg == TAIKO_A_TX_1_2_EN)
1603 adc_reg = TAIKO_A_TX_1_2_TEST_CTL;
1604 else if (w->reg == TAIKO_A_TX_3_4_EN)
1605 adc_reg = TAIKO_A_TX_3_4_TEST_CTL;
1606 else if (w->reg == TAIKO_A_TX_5_6_EN)
1607 adc_reg = TAIKO_A_TX_5_6_TEST_CTL;
1608 else {
1609 pr_err("%s: Error, invalid adc register\n", __func__);
1610 return -EINVAL;
1611 }
1612
1613 if (w->shift == 3)
1614 init_bit_shift = 6;
1615 else if (w->shift == 7)
1616 init_bit_shift = 7;
1617 else {
1618 pr_err("%s: Error, invalid init bit postion adc register\n",
1619 __func__);
1620 return -EINVAL;
1621 }
1622
1623 switch (event) {
1624 case SND_SOC_DAPM_PRE_PMU:
1625 taiko_codec_enable_adc_block(codec, 1);
1626 snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift,
1627 1 << init_bit_shift);
1628 break;
1629 case SND_SOC_DAPM_POST_PMU:
1630
1631 snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift, 0x00);
1632
1633 break;
1634 case SND_SOC_DAPM_POST_PMD:
1635 taiko_codec_enable_adc_block(codec, 0);
1636 break;
1637 }
1638 return 0;
1639}
1640
1641static void taiko_codec_enable_audio_mode_bandgap(struct snd_soc_codec *codec)
1642{
1643 snd_soc_update_bits(codec, TAIKO_A_BIAS_CENTRAL_BG_CTL, 0x80,
1644 0x80);
1645 snd_soc_update_bits(codec, TAIKO_A_BIAS_CENTRAL_BG_CTL, 0x04,
1646 0x04);
1647 snd_soc_update_bits(codec, TAIKO_A_BIAS_CENTRAL_BG_CTL, 0x01,
1648 0x01);
1649 usleep_range(1000, 1000);
1650 snd_soc_update_bits(codec, TAIKO_A_BIAS_CENTRAL_BG_CTL, 0x80,
1651 0x00);
1652}
1653
1654static void taiko_codec_enable_bandgap(struct snd_soc_codec *codec,
1655 enum taiko_bandgap_type choice)
1656{
1657 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
1658
1659 /* TODO lock resources accessed by audio streams and threaded
1660 * interrupt handlers
1661 */
1662
1663 pr_debug("%s, choice is %d, current is %d\n", __func__, choice,
1664 taiko->bandgap_type);
1665
1666 if (taiko->bandgap_type == choice)
1667 return;
1668
1669 if ((taiko->bandgap_type == TAIKO_BANDGAP_OFF) &&
1670 (choice == TAIKO_BANDGAP_AUDIO_MODE)) {
1671 taiko_codec_enable_audio_mode_bandgap(codec);
1672 } else if (choice == TAIKO_BANDGAP_MBHC_MODE) {
1673 /* bandgap mode becomes fast,
1674 * mclk should be off or clk buff source souldn't be VBG
1675 * Let's turn off mclk always */
1676 WARN_ON(snd_soc_read(codec, TAIKO_A_CLK_BUFF_EN2) & (1 << 2));
1677 snd_soc_update_bits(codec, TAIKO_A_BIAS_CENTRAL_BG_CTL, 0x2,
1678 0x2);
1679 snd_soc_update_bits(codec, TAIKO_A_BIAS_CENTRAL_BG_CTL, 0x80,
1680 0x80);
1681 snd_soc_update_bits(codec, TAIKO_A_BIAS_CENTRAL_BG_CTL, 0x4,
1682 0x4);
1683 snd_soc_update_bits(codec, TAIKO_A_BIAS_CENTRAL_BG_CTL, 0x01,
1684 0x01);
1685 usleep_range(1000, 1000);
1686 snd_soc_update_bits(codec, TAIKO_A_BIAS_CENTRAL_BG_CTL, 0x80,
1687 0x00);
1688 } else if ((taiko->bandgap_type == TAIKO_BANDGAP_MBHC_MODE) &&
1689 (choice == TAIKO_BANDGAP_AUDIO_MODE)) {
1690 snd_soc_write(codec, TAIKO_A_BIAS_CENTRAL_BG_CTL, 0x00);
1691 usleep_range(100, 100);
1692 taiko_codec_enable_audio_mode_bandgap(codec);
1693 } else if (choice == TAIKO_BANDGAP_OFF) {
1694 snd_soc_write(codec, TAIKO_A_BIAS_CENTRAL_BG_CTL, 0x00);
1695 } else {
1696 pr_err("%s: Error, Invalid bandgap settings\n", __func__);
1697 }
1698 taiko->bandgap_type = choice;
1699}
1700
1701static void taiko_codec_disable_clock_block(struct snd_soc_codec *codec)
1702{
1703 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
1704 pr_debug("%s\n", __func__);
1705 snd_soc_update_bits(codec, TAIKO_A_CLK_BUFF_EN2, 0x04, 0x00);
1706 usleep_range(50, 50);
1707 snd_soc_update_bits(codec, TAIKO_A_CLK_BUFF_EN2, 0x02, 0x02);
1708 snd_soc_update_bits(codec, TAIKO_A_CLK_BUFF_EN1, 0x05, 0x00);
1709 usleep_range(50, 50);
1710 taiko->clock_active = false;
1711}
1712
1713static int taiko_codec_mclk_index(const struct taiko_priv *taiko)
1714{
1715 if (taiko->mbhc_cfg.mclk_rate == TAIKO_MCLK_RATE_12288KHZ)
1716 return 0;
1717 else if (taiko->mbhc_cfg.mclk_rate == TAIKO_MCLK_RATE_9600KHZ)
1718 return 1;
1719 else {
1720 BUG_ON(1);
1721 return -EINVAL;
1722 }
1723}
1724
1725static void taiko_enable_rx_bias(struct snd_soc_codec *codec, u32 enable)
1726{
1727 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
1728
1729 if (enable) {
1730 taiko->rx_bias_count++;
1731 if (taiko->rx_bias_count == 1)
1732 snd_soc_update_bits(codec, TAIKO_A_RX_COM_BIAS,
1733 0x80, 0x80);
1734 } else {
1735 taiko->rx_bias_count--;
1736 if (!taiko->rx_bias_count)
1737 snd_soc_update_bits(codec, TAIKO_A_RX_COM_BIAS,
1738 0x80, 0x00);
1739 }
1740}
1741
1742static int taiko_codec_enable_config_mode(struct snd_soc_codec *codec,
1743 int enable)
1744{
1745 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
1746
1747 pr_debug("%s: enable = %d\n", __func__, enable);
1748 if (enable) {
1749
1750 snd_soc_update_bits(codec, TAIKO_A_RC_OSC_FREQ, 0x10, 0);
1751 /* bandgap mode to fast */
1752 snd_soc_write(codec, TAIKO_A_BIAS_OSC_BG_CTL, 0x17);
1753 usleep_range(5, 5);
1754 snd_soc_update_bits(codec, TAIKO_A_RC_OSC_FREQ, 0x80,
1755 0x80);
1756 snd_soc_update_bits(codec, TAIKO_A_RC_OSC_TEST, 0x80,
1757 0x80);
1758 usleep_range(10, 10);
1759 snd_soc_update_bits(codec, TAIKO_A_RC_OSC_TEST, 0x80, 0);
1760 usleep_range(10000, 10000);
1761 snd_soc_update_bits(codec, TAIKO_A_CLK_BUFF_EN1, 0x08, 0x08);
1762
1763 } else {
1764 snd_soc_update_bits(codec, TAIKO_A_BIAS_OSC_BG_CTL, 0x1,
1765 0);
1766 snd_soc_update_bits(codec, TAIKO_A_RC_OSC_FREQ, 0x80, 0);
1767 /* clk source to ext clk and clk buff ref to VBG */
1768 snd_soc_update_bits(codec, TAIKO_A_CLK_BUFF_EN1, 0x0C, 0x04);
1769 }
1770 taiko->config_mode_active = enable ? true : false;
1771
1772 return 0;
1773}
1774
1775static int taiko_codec_enable_clock_block(struct snd_soc_codec *codec,
1776 int config_mode)
1777{
1778 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
1779
1780 pr_debug("%s: config_mode = %d\n", __func__, config_mode);
1781
1782 /* transit to RCO requires mclk off */
1783 WARN_ON(snd_soc_read(codec, TAIKO_A_CLK_BUFF_EN2) & (1 << 2));
1784 if (config_mode) {
1785 /* enable RCO and switch to it */
1786 taiko_codec_enable_config_mode(codec, 1);
1787 snd_soc_write(codec, TAIKO_A_CLK_BUFF_EN2, 0x02);
1788 usleep_range(1000, 1000);
1789 } else {
1790 /* switch to MCLK */
1791 snd_soc_update_bits(codec, TAIKO_A_CLK_BUFF_EN1, 0x08, 0x00);
1792
1793 if (taiko->mbhc_polling_active) {
1794 snd_soc_write(codec, TAIKO_A_CLK_BUFF_EN2, 0x02);
1795 taiko_codec_enable_config_mode(codec, 0);
1796 }
1797 }
1798
1799 snd_soc_update_bits(codec, TAIKO_A_CLK_BUFF_EN1, 0x01, 0x01);
1800 snd_soc_update_bits(codec, TAIKO_A_CLK_BUFF_EN2, 0x02, 0x00);
1801 /* on MCLK */
1802 snd_soc_update_bits(codec, TAIKO_A_CLK_BUFF_EN2, 0x04, 0x04);
1803 snd_soc_update_bits(codec, TAIKO_A_CDC_CLK_MCLK_CTL, 0x01, 0x01);
1804 usleep_range(50, 50);
1805 taiko->clock_active = true;
1806 return 0;
1807}
1808
1809static int taiko_codec_enable_aux_pga(struct snd_soc_dapm_widget *w,
1810 struct snd_kcontrol *kcontrol, int event)
1811{
1812 struct snd_soc_codec *codec = w->codec;
1813 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
1814
1815 pr_debug("%s: %d\n", __func__, event);
1816
1817 switch (event) {
1818 case SND_SOC_DAPM_PRE_PMU:
1819 taiko_codec_enable_bandgap(codec, TAIKO_BANDGAP_AUDIO_MODE);
1820 taiko_enable_rx_bias(codec, 1);
1821
1822 if (taiko->aux_pga_cnt++ == 1
1823 && !taiko->mclk_enabled) {
1824 taiko_codec_enable_clock_block(codec, 1);
1825 pr_debug("AUX PGA enabled RC osc\n");
1826 }
1827 break;
1828
1829 case SND_SOC_DAPM_POST_PMD:
1830 taiko_enable_rx_bias(codec, 0);
1831
1832 if (taiko->aux_pga_cnt-- == 0) {
1833 if (taiko->mbhc_polling_active)
1834 taiko_codec_enable_bandgap(codec,
1835 TAIKO_BANDGAP_MBHC_MODE);
1836 else
1837 taiko_codec_enable_bandgap(codec,
1838 TAIKO_BANDGAP_OFF);
1839
1840 if (!taiko->mclk_enabled &&
1841 !taiko->mbhc_polling_active) {
1842 taiko_codec_enable_clock_block(codec, 0);
1843 }
1844 }
1845 break;
1846 }
1847 return 0;
1848}
1849
1850static int taiko_codec_enable_lineout(struct snd_soc_dapm_widget *w,
1851 struct snd_kcontrol *kcontrol, int event)
1852{
1853 struct snd_soc_codec *codec = w->codec;
1854 u16 lineout_gain_reg;
1855
1856 pr_debug("%s %d %s\n", __func__, event, w->name);
1857
1858 switch (w->shift) {
1859 case 0:
1860 lineout_gain_reg = TAIKO_A_RX_LINE_1_GAIN;
1861 break;
1862 case 1:
1863 lineout_gain_reg = TAIKO_A_RX_LINE_2_GAIN;
1864 break;
1865 case 2:
1866 lineout_gain_reg = TAIKO_A_RX_LINE_3_GAIN;
1867 break;
1868 case 3:
1869 lineout_gain_reg = TAIKO_A_RX_LINE_4_GAIN;
1870 break;
1871 default:
1872 pr_err("%s: Error, incorrect lineout register value\n",
1873 __func__);
1874 return -EINVAL;
1875 }
1876
1877 switch (event) {
1878 case SND_SOC_DAPM_PRE_PMU:
1879 snd_soc_update_bits(codec, lineout_gain_reg, 0x40, 0x40);
1880 break;
1881 case SND_SOC_DAPM_POST_PMU:
1882 pr_debug("%s: sleeping 16 ms after %s PA turn on\n",
1883 __func__, w->name);
1884 usleep_range(16000, 16000);
1885 break;
1886 case SND_SOC_DAPM_POST_PMD:
1887 snd_soc_update_bits(codec, lineout_gain_reg, 0x40, 0x00);
1888 break;
1889 }
1890 return 0;
1891}
1892
1893
1894static int taiko_codec_enable_dmic(struct snd_soc_dapm_widget *w,
1895 struct snd_kcontrol *kcontrol, int event)
1896{
1897 struct snd_soc_codec *codec = w->codec;
1898 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
1899 u8 dmic_clk_en;
1900 u16 dmic_clk_reg;
1901 s32 *dmic_clk_cnt;
1902 unsigned int dmic;
1903 int ret;
1904
1905 ret = kstrtouint(strpbrk(w->name, "123456"), 10, &dmic);
1906 if (ret < 0) {
1907 pr_err("%s: Invalid DMIC line on the codec\n", __func__);
1908 return -EINVAL;
1909 }
1910
1911 switch (dmic) {
1912 case 1:
1913 case 2:
1914 dmic_clk_en = 0x01;
1915 dmic_clk_cnt = &(taiko->dmic_1_2_clk_cnt);
1916 dmic_clk_reg = TAIKO_A_CDC_CLK_DMIC_B1_CTL;
1917 pr_debug("%s() event %d DMIC%d dmic_1_2_clk_cnt %d\n",
1918 __func__, event, dmic, *dmic_clk_cnt);
1919
1920 break;
1921
1922 case 3:
1923 case 4:
1924 dmic_clk_en = 0x10;
1925 dmic_clk_cnt = &(taiko->dmic_3_4_clk_cnt);
1926 dmic_clk_reg = TAIKO_A_CDC_CLK_DMIC_B1_CTL;
1927
1928 pr_debug("%s() event %d DMIC%d dmic_3_4_clk_cnt %d\n",
1929 __func__, event, dmic, *dmic_clk_cnt);
1930 break;
1931
1932 case 5:
1933 case 6:
1934 dmic_clk_en = 0x01;
1935 dmic_clk_cnt = &(taiko->dmic_5_6_clk_cnt);
1936 dmic_clk_reg = TAIKO_A_CDC_CLK_DMIC_B2_CTL;
1937
1938 pr_debug("%s() event %d DMIC%d dmic_5_6_clk_cnt %d\n",
1939 __func__, event, dmic, *dmic_clk_cnt);
1940
1941 break;
1942
1943 default:
1944 pr_err("%s: Invalid DMIC Selection\n", __func__);
1945 return -EINVAL;
1946 }
1947
1948 switch (event) {
1949 case SND_SOC_DAPM_PRE_PMU:
1950
1951 (*dmic_clk_cnt)++;
1952 if (*dmic_clk_cnt == 1)
1953 snd_soc_update_bits(codec, dmic_clk_reg,
1954 dmic_clk_en, dmic_clk_en);
1955
1956 break;
1957 case SND_SOC_DAPM_POST_PMD:
1958
1959 (*dmic_clk_cnt)--;
1960 if (*dmic_clk_cnt == 0)
1961 snd_soc_update_bits(codec, dmic_clk_reg,
1962 dmic_clk_en, 0);
1963 break;
1964 }
1965 return 0;
1966}
1967
1968static int taiko_codec_enable_anc(struct snd_soc_dapm_widget *w,
1969 struct snd_kcontrol *kcontrol, int event)
1970{
1971 struct snd_soc_codec *codec = w->codec;
1972 const char *filename;
1973 const struct firmware *fw;
1974 int i;
1975 int ret;
1976 int num_anc_slots;
1977 struct anc_header *anc_head;
1978 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
1979 u32 anc_writes_size = 0;
1980 int anc_size_remaining;
1981 u32 *anc_ptr;
1982 u16 reg;
1983 u8 mask, val, old_val;
1984
1985 pr_debug("%s %d\n", __func__, event);
1986 switch (event) {
1987 case SND_SOC_DAPM_PRE_PMU:
1988
1989 filename = "wcd9320/wcd9320_anc.bin";
1990
1991 ret = request_firmware(&fw, filename, codec->dev);
1992 if (ret != 0) {
1993 dev_err(codec->dev, "Failed to acquire ANC data: %d\n",
1994 ret);
1995 return -ENODEV;
1996 }
1997
1998 if (fw->size < sizeof(struct anc_header)) {
1999 dev_err(codec->dev, "Not enough data\n");
2000 release_firmware(fw);
2001 return -ENOMEM;
2002 }
2003
2004 /* First number is the number of register writes */
2005 anc_head = (struct anc_header *)(fw->data);
2006 anc_ptr = (u32 *)((u32)fw->data + sizeof(struct anc_header));
2007 anc_size_remaining = fw->size - sizeof(struct anc_header);
2008 num_anc_slots = anc_head->num_anc_slots;
2009
2010 if (taiko->anc_slot >= num_anc_slots) {
2011 dev_err(codec->dev, "Invalid ANC slot selected\n");
2012 release_firmware(fw);
2013 return -EINVAL;
2014 }
2015
2016 for (i = 0; i < num_anc_slots; i++) {
2017
2018 if (anc_size_remaining < TAIKO_PACKED_REG_SIZE) {
2019 dev_err(codec->dev, "Invalid register format\n");
2020 release_firmware(fw);
2021 return -EINVAL;
2022 }
2023 anc_writes_size = (u32)(*anc_ptr);
2024 anc_size_remaining -= sizeof(u32);
2025 anc_ptr += 1;
2026
2027 if (anc_writes_size * TAIKO_PACKED_REG_SIZE
2028 > anc_size_remaining) {
2029 dev_err(codec->dev, "Invalid register format\n");
2030 release_firmware(fw);
2031 return -ENOMEM;
2032 }
2033
2034 if (taiko->anc_slot == i)
2035 break;
2036
2037 anc_size_remaining -= (anc_writes_size *
2038 TAIKO_PACKED_REG_SIZE);
2039 anc_ptr += anc_writes_size;
2040 }
2041 if (i == num_anc_slots) {
2042 dev_err(codec->dev, "Selected ANC slot not present\n");
2043 release_firmware(fw);
2044 return -ENOMEM;
2045 }
2046
2047 for (i = 0; i < anc_writes_size; i++) {
2048 TAIKO_CODEC_UNPACK_ENTRY(anc_ptr[i], reg,
2049 mask, val);
2050 old_val = snd_soc_read(codec, reg);
2051 snd_soc_write(codec, reg, (old_val & ~mask) |
2052 (val & mask));
2053 }
2054 release_firmware(fw);
2055
2056 break;
2057 case SND_SOC_DAPM_POST_PMD:
2058 snd_soc_write(codec, TAIKO_A_CDC_CLK_ANC_RESET_CTL, 0xFF);
2059 snd_soc_write(codec, TAIKO_A_CDC_CLK_ANC_CLK_EN_CTL, 0);
2060 break;
2061 }
2062 return 0;
2063}
2064
2065/* called under codec_resource_lock acquisition */
2066static void taiko_codec_start_hs_polling(struct snd_soc_codec *codec)
2067{
2068 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
2069 int mbhc_state = taiko->mbhc_state;
2070
2071 pr_debug("%s: enter\n", __func__);
2072 if (!taiko->mbhc_polling_active) {
2073 pr_debug("Polling is not active, do not start polling\n");
2074 return;
2075 }
2076 snd_soc_write(codec, TAIKO_A_MBHC_SCALING_MUX_1, 0x84);
2077
2078 if (!taiko->no_mic_headset_override) {
2079 if (mbhc_state == MBHC_STATE_POTENTIAL) {
2080 pr_debug("%s recovering MBHC state macine\n", __func__);
2081 taiko->mbhc_state = MBHC_STATE_POTENTIAL_RECOVERY;
2082 /* set to max button press threshold */
2083 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B2_CTL,
2084 0x7F);
2085 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B1_CTL,
2086 0xFF);
2087 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B4_CTL,
2088 0x7F);
2089 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B3_CTL,
2090 0xFF);
2091 /* set to max */
2092 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B6_CTL,
2093 0x7F);
2094 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B5_CTL,
2095 0xFF);
2096 }
2097 }
2098
2099 snd_soc_write(codec, TAIKO_A_CDC_MBHC_EN_CTL, 0x1);
2100 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x8, 0x0);
2101 snd_soc_write(codec, TAIKO_A_CDC_MBHC_EN_CTL, 0x1);
2102 pr_debug("%s: leave\n", __func__);
2103}
2104
2105/* called under codec_resource_lock acquisition */
2106static void taiko_codec_pause_hs_polling(struct snd_soc_codec *codec)
2107{
2108 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
2109
2110 pr_debug("%s: enter\n", __func__);
2111 if (!taiko->mbhc_polling_active) {
2112 pr_debug("polling not active, nothing to pause\n");
2113 return;
2114 }
2115
2116 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x8, 0x8);
2117 pr_debug("%s: leave\n", __func__);
2118}
2119
2120static void taiko_codec_switch_cfilt_mode(struct snd_soc_codec *codec, int mode)
2121{
2122 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
2123 u8 reg_mode_val, cur_mode_val;
2124 bool mbhc_was_polling = false;
2125
2126 if (mode)
2127 reg_mode_val = TAIKO_CFILT_FAST_MODE;
2128 else
2129 reg_mode_val = TAIKO_CFILT_SLOW_MODE;
2130
2131 cur_mode_val = snd_soc_read(codec,
2132 taiko->mbhc_bias_regs.cfilt_ctl) & 0x40;
2133
2134 if (cur_mode_val != reg_mode_val) {
2135 TAIKO_ACQUIRE_LOCK(taiko->codec_resource_lock);
2136 if (taiko->mbhc_polling_active) {
2137 taiko_codec_pause_hs_polling(codec);
2138 mbhc_was_polling = true;
2139 }
2140 snd_soc_update_bits(codec,
2141 taiko->mbhc_bias_regs.cfilt_ctl, 0x40, reg_mode_val);
2142 if (mbhc_was_polling)
2143 taiko_codec_start_hs_polling(codec);
2144 TAIKO_RELEASE_LOCK(taiko->codec_resource_lock);
2145 pr_debug("%s: CFILT mode change (%x to %x)\n", __func__,
2146 cur_mode_val, reg_mode_val);
2147 } else {
2148 pr_debug("%s: CFILT Value is already %x\n",
2149 __func__, cur_mode_val);
2150 }
2151}
2152
2153static void taiko_codec_update_cfilt_usage(struct snd_soc_codec *codec,
2154 u8 cfilt_sel, int inc)
2155{
2156 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
2157 u32 *cfilt_cnt_ptr = NULL;
2158 u16 micb_cfilt_reg;
2159
2160 switch (cfilt_sel) {
2161 case TAIKO_CFILT1_SEL:
2162 cfilt_cnt_ptr = &taiko->cfilt1_cnt;
2163 micb_cfilt_reg = TAIKO_A_MICB_CFILT_1_CTL;
2164 break;
2165 case TAIKO_CFILT2_SEL:
2166 cfilt_cnt_ptr = &taiko->cfilt2_cnt;
2167 micb_cfilt_reg = TAIKO_A_MICB_CFILT_2_CTL;
2168 break;
2169 case TAIKO_CFILT3_SEL:
2170 cfilt_cnt_ptr = &taiko->cfilt3_cnt;
2171 micb_cfilt_reg = TAIKO_A_MICB_CFILT_3_CTL;
2172 break;
2173 default:
2174 return; /* should not happen */
2175 }
2176
2177 if (inc) {
2178 if (!(*cfilt_cnt_ptr)++) {
2179 /* Switch CFILT to slow mode if MBHC CFILT being used */
2180 if (cfilt_sel == taiko->mbhc_bias_regs.cfilt_sel)
2181 taiko_codec_switch_cfilt_mode(codec, 0);
2182
2183 snd_soc_update_bits(codec, micb_cfilt_reg, 0x80, 0x80);
2184 }
2185 } else {
2186 /* check if count not zero, decrement
2187 * then check if zero, go ahead disable cfilter
2188 */
2189 if ((*cfilt_cnt_ptr) && !--(*cfilt_cnt_ptr)) {
2190 snd_soc_update_bits(codec, micb_cfilt_reg, 0x80, 0);
2191
2192 /* Switch CFILT to fast mode if MBHC CFILT being used */
2193 if (cfilt_sel == taiko->mbhc_bias_regs.cfilt_sel)
2194 taiko_codec_switch_cfilt_mode(codec, 1);
2195 }
2196 }
2197}
2198
2199static int taiko_find_k_value(unsigned int ldoh_v, unsigned int cfilt_mv)
2200{
2201 int rc = -EINVAL;
2202 unsigned min_mv, max_mv;
2203
2204 switch (ldoh_v) {
2205 case TAIKO_LDOH_1P95_V:
2206 min_mv = 160;
2207 max_mv = 1800;
2208 break;
2209 case TAIKO_LDOH_2P35_V:
2210 min_mv = 200;
2211 max_mv = 2200;
2212 break;
2213 case TAIKO_LDOH_2P75_V:
2214 min_mv = 240;
2215 max_mv = 2600;
2216 break;
2217 case TAIKO_LDOH_2P85_V:
2218 min_mv = 250;
2219 max_mv = 2700;
2220 break;
2221 default:
2222 goto done;
2223 }
2224
2225 if (cfilt_mv < min_mv || cfilt_mv > max_mv)
2226 goto done;
2227
2228 for (rc = 4; rc <= 44; rc++) {
2229 min_mv = max_mv * (rc) / 44;
2230 if (min_mv >= cfilt_mv) {
2231 rc -= 4;
2232 break;
2233 }
2234 }
2235done:
2236 return rc;
2237}
2238
2239static bool taiko_is_hph_pa_on(struct snd_soc_codec *codec)
2240{
2241 u8 hph_reg_val = 0;
2242 hph_reg_val = snd_soc_read(codec, TAIKO_A_RX_HPH_CNP_EN);
2243
2244 return (hph_reg_val & 0x30) ? true : false;
2245}
2246
2247static bool taiko_is_hph_dac_on(struct snd_soc_codec *codec, int left)
2248{
2249 u8 hph_reg_val = 0;
2250 if (left)
2251 hph_reg_val = snd_soc_read(codec,
2252 TAIKO_A_RX_HPH_L_DAC_CTL);
2253 else
2254 hph_reg_val = snd_soc_read(codec,
2255 TAIKO_A_RX_HPH_R_DAC_CTL);
2256
2257 return (hph_reg_val & 0xC0) ? true : false;
2258}
2259
2260static void taiko_turn_onoff_override(struct snd_soc_codec *codec, bool on)
2261{
2262 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_B1_CTL, 0x04, on << 2);
2263}
2264
2265/* called under codec_resource_lock acquisition */
2266static void taiko_codec_drive_v_to_micbias(struct snd_soc_codec *codec,
2267 int usec)
2268{
2269 int cfilt_k_val;
2270 bool set = true;
2271 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
2272
2273 if (taiko->mbhc_data.micb_mv != VDDIO_MICBIAS_MV &&
2274 taiko->mbhc_micbias_switched) {
2275 pr_debug("%s: set mic V to micbias V\n", __func__);
2276 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x2, 0x2);
2277 taiko_turn_onoff_override(codec, true);
2278 while (1) {
2279 cfilt_k_val = taiko_find_k_value(
2280 taiko->pdata->micbias.ldoh_v,
2281 set ? taiko->mbhc_data.micb_mv :
2282 VDDIO_MICBIAS_MV);
2283 snd_soc_update_bits(codec,
2284 taiko->mbhc_bias_regs.cfilt_val,
2285 0xFC, (cfilt_k_val << 2));
2286 if (!set)
2287 break;
2288 usleep_range(usec, usec);
2289 set = false;
2290 }
2291 taiko_turn_onoff_override(codec, false);
2292 }
2293}
2294
2295/* called under codec_resource_lock acquisition */
2296static void __taiko_codec_switch_micbias(struct snd_soc_codec *codec,
2297 int vddio_switch, bool restartpolling,
2298 bool checkpolling)
2299{
2300 int cfilt_k_val;
2301 bool override;
2302 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
2303
2304 if (vddio_switch && !taiko->mbhc_micbias_switched &&
2305 (!checkpolling || taiko->mbhc_polling_active)) {
2306 if (restartpolling)
2307 taiko_codec_pause_hs_polling(codec);
2308 override = snd_soc_read(codec, TAIKO_A_CDC_MBHC_B1_CTL) & 0x04;
2309 if (!override)
2310 taiko_turn_onoff_override(codec, true);
2311 /* Adjust threshold if Mic Bias voltage changes */
2312 if (taiko->mbhc_data.micb_mv != VDDIO_MICBIAS_MV) {
2313 cfilt_k_val = taiko_find_k_value(
2314 taiko->pdata->micbias.ldoh_v,
2315 VDDIO_MICBIAS_MV);
2316 usleep_range(10000, 10000);
2317 snd_soc_update_bits(codec,
2318 taiko->mbhc_bias_regs.cfilt_val,
2319 0xFC, (cfilt_k_val << 2));
2320 usleep_range(10000, 10000);
2321 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B1_CTL,
2322 taiko->mbhc_data.adj_v_ins_hu & 0xFF);
2323 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B2_CTL,
2324 (taiko->mbhc_data.adj_v_ins_hu >> 8) &
2325 0xFF);
2326 pr_debug("%s: Programmed MBHC thresholds to VDDIO\n",
2327 __func__);
2328 }
2329
2330 /* enable MIC BIAS Switch to VDDIO */
2331 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.mbhc_reg,
2332 0x80, 0x80);
2333 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.mbhc_reg,
2334 0x10, 0x00);
2335 if (!override)
2336 taiko_turn_onoff_override(codec, false);
2337 if (restartpolling)
2338 taiko_codec_start_hs_polling(codec);
2339
2340 taiko->mbhc_micbias_switched = true;
2341 pr_debug("%s: VDDIO switch enabled\n", __func__);
2342 } else if (!vddio_switch && taiko->mbhc_micbias_switched) {
2343 if ((!checkpolling || taiko->mbhc_polling_active) &&
2344 restartpolling)
2345 taiko_codec_pause_hs_polling(codec);
2346 /* Reprogram thresholds */
2347 if (taiko->mbhc_data.micb_mv != VDDIO_MICBIAS_MV) {
2348 cfilt_k_val = taiko_find_k_value(
2349 taiko->pdata->micbias.ldoh_v,
2350 taiko->mbhc_data.micb_mv);
2351 snd_soc_update_bits(codec,
2352 taiko->mbhc_bias_regs.cfilt_val,
2353 0xFC, (cfilt_k_val << 2));
2354 usleep_range(10000, 10000);
2355 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B1_CTL,
2356 taiko->mbhc_data.v_ins_hu & 0xFF);
2357 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B2_CTL,
2358 (taiko->mbhc_data.v_ins_hu >> 8) & 0xFF);
2359 pr_debug("%s: Programmed MBHC thresholds to MICBIAS\n",
2360 __func__);
2361 }
2362
2363 /* Disable MIC BIAS Switch to VDDIO */
2364 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.mbhc_reg,
2365 0x80, 0x00);
2366 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.mbhc_reg,
2367 0x10, 0x00);
2368
2369 if ((!checkpolling || taiko->mbhc_polling_active) &&
2370 restartpolling)
2371 taiko_codec_start_hs_polling(codec);
2372
2373 taiko->mbhc_micbias_switched = false;
2374 pr_debug("%s: VDDIO switch disabled\n", __func__);
2375 }
2376}
2377
2378static void taiko_codec_switch_micbias(struct snd_soc_codec *codec,
2379 int vddio_switch)
2380{
2381 return __taiko_codec_switch_micbias(codec, vddio_switch, true, true);
2382}
2383
2384static int taiko_codec_enable_micbias(struct snd_soc_dapm_widget *w,
2385 struct snd_kcontrol *kcontrol, int event)
2386{
2387 struct snd_soc_codec *codec = w->codec;
2388 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
2389 u16 micb_int_reg;
2390 int micb_line;
2391 u8 cfilt_sel_val = 0;
2392 char *internal1_text = "Internal1";
2393 char *internal2_text = "Internal2";
2394 char *internal3_text = "Internal3";
2395
2396 pr_debug("%s %d\n", __func__, event);
2397 switch (w->reg) {
2398 case TAIKO_A_MICB_1_CTL:
2399 micb_int_reg = TAIKO_A_MICB_1_INT_RBIAS;
2400 cfilt_sel_val = taiko->pdata->micbias.bias1_cfilt_sel;
2401 micb_line = TAIKO_MICBIAS1;
2402 break;
2403 case TAIKO_A_MICB_2_CTL:
2404 micb_int_reg = TAIKO_A_MICB_2_INT_RBIAS;
2405 cfilt_sel_val = taiko->pdata->micbias.bias2_cfilt_sel;
2406 micb_line = TAIKO_MICBIAS2;
2407 break;
2408 case TAIKO_A_MICB_3_CTL:
2409 micb_int_reg = TAIKO_A_MICB_3_INT_RBIAS;
2410 cfilt_sel_val = taiko->pdata->micbias.bias3_cfilt_sel;
2411 micb_line = TAIKO_MICBIAS3;
2412 break;
2413 case TAIKO_A_MICB_4_CTL:
2414 micb_int_reg = taiko->reg_addr.micb_4_int_rbias;
2415 cfilt_sel_val = taiko->pdata->micbias.bias4_cfilt_sel;
2416 micb_line = TAIKO_MICBIAS4;
2417 break;
2418 default:
2419 pr_err("%s: Error, invalid micbias register\n", __func__);
2420 return -EINVAL;
2421 }
2422
2423 switch (event) {
2424 case SND_SOC_DAPM_PRE_PMU:
2425 /* Decide whether to switch the micbias for MBHC */
2426 if (w->reg == taiko->mbhc_bias_regs.ctl_reg) {
2427 TAIKO_ACQUIRE_LOCK(taiko->codec_resource_lock);
2428 taiko_codec_switch_micbias(codec, 0);
2429 TAIKO_RELEASE_LOCK(taiko->codec_resource_lock);
2430 }
2431
2432 snd_soc_update_bits(codec, w->reg, 0x0E, 0x0A);
2433 taiko_codec_update_cfilt_usage(codec, cfilt_sel_val, 1);
2434
2435 if (strnstr(w->name, internal1_text, 30))
2436 snd_soc_update_bits(codec, micb_int_reg, 0xE0, 0xE0);
2437 else if (strnstr(w->name, internal2_text, 30))
2438 snd_soc_update_bits(codec, micb_int_reg, 0x1C, 0x1C);
2439 else if (strnstr(w->name, internal3_text, 30))
2440 snd_soc_update_bits(codec, micb_int_reg, 0x3, 0x3);
2441
2442 break;
2443 case SND_SOC_DAPM_POST_PMU:
2444
2445 usleep_range(20000, 20000);
2446
2447 if (taiko->mbhc_polling_active &&
2448 taiko->mbhc_cfg.micbias == micb_line) {
2449 TAIKO_ACQUIRE_LOCK(taiko->codec_resource_lock);
2450 taiko_codec_pause_hs_polling(codec);
2451 taiko_codec_start_hs_polling(codec);
2452 TAIKO_RELEASE_LOCK(taiko->codec_resource_lock);
2453 }
2454 break;
2455
2456 case SND_SOC_DAPM_POST_PMD:
2457 if ((w->reg == taiko->mbhc_bias_regs.ctl_reg) &&
2458 taiko_is_hph_pa_on(codec)) {
2459 TAIKO_ACQUIRE_LOCK(taiko->codec_resource_lock);
2460 taiko_codec_switch_micbias(codec, 1);
2461 TAIKO_RELEASE_LOCK(taiko->codec_resource_lock);
2462 }
2463
2464 if (strnstr(w->name, internal1_text, 30))
2465 snd_soc_update_bits(codec, micb_int_reg, 0x80, 0x00);
2466 else if (strnstr(w->name, internal2_text, 30))
2467 snd_soc_update_bits(codec, micb_int_reg, 0x10, 0x00);
2468 else if (strnstr(w->name, internal3_text, 30))
2469 snd_soc_update_bits(codec, micb_int_reg, 0x2, 0x0);
2470
2471 taiko_codec_update_cfilt_usage(codec, cfilt_sel_val, 0);
2472 break;
2473 }
2474
2475 return 0;
2476}
2477
2478
2479static void tx_hpf_corner_freq_callback(struct work_struct *work)
2480{
2481 struct delayed_work *hpf_delayed_work;
2482 struct hpf_work *hpf_work;
2483 struct taiko_priv *taiko;
2484 struct snd_soc_codec *codec;
2485 u16 tx_mux_ctl_reg;
2486 u8 hpf_cut_of_freq;
2487
2488 hpf_delayed_work = to_delayed_work(work);
2489 hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork);
2490 taiko = hpf_work->taiko;
2491 codec = hpf_work->taiko->codec;
2492 hpf_cut_of_freq = hpf_work->tx_hpf_cut_of_freq;
2493
2494 tx_mux_ctl_reg = TAIKO_A_CDC_TX1_MUX_CTL +
2495 (hpf_work->decimator - 1) * 8;
2496
2497 pr_debug("%s(): decimator %u hpf_cut_of_freq 0x%x\n", __func__,
2498 hpf_work->decimator, (unsigned int)hpf_cut_of_freq);
2499
2500 snd_soc_update_bits(codec, tx_mux_ctl_reg, 0x30, hpf_cut_of_freq << 4);
2501}
2502
2503#define TX_MUX_CTL_CUT_OFF_FREQ_MASK 0x30
2504#define CF_MIN_3DB_4HZ 0x0
2505#define CF_MIN_3DB_75HZ 0x1
2506#define CF_MIN_3DB_150HZ 0x2
2507
2508static int taiko_codec_enable_dec(struct snd_soc_dapm_widget *w,
2509 struct snd_kcontrol *kcontrol, int event)
2510{
2511 struct snd_soc_codec *codec = w->codec;
2512 unsigned int decimator;
2513 char *dec_name = NULL;
2514 char *widget_name = NULL;
2515 char *temp;
2516 int ret = 0;
2517 u16 dec_reset_reg, tx_vol_ctl_reg, tx_mux_ctl_reg;
2518 u8 dec_hpf_cut_of_freq;
2519 int offset;
2520
2521
2522 pr_debug("%s %d\n", __func__, event);
2523
2524 widget_name = kstrndup(w->name, 15, GFP_KERNEL);
2525 if (!widget_name)
2526 return -ENOMEM;
2527 temp = widget_name;
2528
2529 dec_name = strsep(&widget_name, " ");
2530 widget_name = temp;
2531 if (!dec_name) {
2532 pr_err("%s: Invalid decimator = %s\n", __func__, w->name);
2533 ret = -EINVAL;
2534 goto out;
2535 }
2536
2537 ret = kstrtouint(strpbrk(dec_name, "123456789"), 10, &decimator);
2538 if (ret < 0) {
2539 pr_err("%s: Invalid decimator = %s\n", __func__, dec_name);
2540 ret = -EINVAL;
2541 goto out;
2542 }
2543
2544 pr_debug("%s(): widget = %s dec_name = %s decimator = %u\n", __func__,
2545 w->name, dec_name, decimator);
2546
2547 if (w->reg == TAIKO_A_CDC_CLK_TX_CLK_EN_B1_CTL) {
2548 dec_reset_reg = TAIKO_A_CDC_CLK_TX_RESET_B1_CTL;
2549 offset = 0;
2550 } else if (w->reg == TAIKO_A_CDC_CLK_TX_CLK_EN_B2_CTL) {
2551 dec_reset_reg = TAIKO_A_CDC_CLK_TX_RESET_B2_CTL;
2552 offset = 8;
2553 } else {
2554 pr_err("%s: Error, incorrect dec\n", __func__);
2555 return -EINVAL;
2556 }
2557
2558 tx_vol_ctl_reg = TAIKO_A_CDC_TX1_VOL_CTL_CFG + 8 * (decimator - 1);
2559 tx_mux_ctl_reg = TAIKO_A_CDC_TX1_MUX_CTL + 8 * (decimator - 1);
2560
2561 switch (event) {
2562 case SND_SOC_DAPM_PRE_PMU:
2563
2564 /* Enableable TX digital mute */
2565 snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x01, 0x01);
2566
2567 snd_soc_update_bits(codec, dec_reset_reg, 1 << w->shift,
2568 1 << w->shift);
2569 snd_soc_update_bits(codec, dec_reset_reg, 1 << w->shift, 0x0);
2570
2571 dec_hpf_cut_of_freq = snd_soc_read(codec, tx_mux_ctl_reg);
2572
2573 dec_hpf_cut_of_freq = (dec_hpf_cut_of_freq & 0x30) >> 4;
2574
2575 tx_hpf_work[decimator - 1].tx_hpf_cut_of_freq =
2576 dec_hpf_cut_of_freq;
2577
2578 if ((dec_hpf_cut_of_freq != CF_MIN_3DB_150HZ)) {
2579
2580 /* set cut of freq to CF_MIN_3DB_150HZ (0x1); */
2581 snd_soc_update_bits(codec, tx_mux_ctl_reg, 0x30,
2582 CF_MIN_3DB_150HZ << 4);
2583 }
2584
2585 /* enable HPF */
2586 snd_soc_update_bits(codec, tx_mux_ctl_reg , 0x08, 0x00);
2587
2588 break;
2589
2590 case SND_SOC_DAPM_POST_PMU:
2591
2592 /* Disable TX digital mute */
2593 snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x01, 0x00);
2594
2595 if (tx_hpf_work[decimator - 1].tx_hpf_cut_of_freq !=
2596 CF_MIN_3DB_150HZ) {
2597
2598 schedule_delayed_work(&tx_hpf_work[decimator - 1].dwork,
2599 msecs_to_jiffies(300));
2600 }
2601 /* apply the digital gain after the decimator is enabled*/
2602 if ((w->shift) < ARRAY_SIZE(rx_digital_gain_reg))
2603 snd_soc_write(codec,
2604 tx_digital_gain_reg[w->shift + offset],
2605 snd_soc_read(codec,
2606 tx_digital_gain_reg[w->shift + offset])
2607 );
2608
2609 break;
2610
2611 case SND_SOC_DAPM_PRE_PMD:
2612
2613 snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x01, 0x01);
2614 cancel_delayed_work_sync(&tx_hpf_work[decimator - 1].dwork);
2615 break;
2616
2617 case SND_SOC_DAPM_POST_PMD:
2618
2619 snd_soc_update_bits(codec, tx_mux_ctl_reg, 0x08, 0x08);
2620 snd_soc_update_bits(codec, tx_mux_ctl_reg, 0x30,
2621 (tx_hpf_work[decimator - 1].tx_hpf_cut_of_freq) << 4);
2622
2623 break;
2624 }
2625out:
2626 kfree(widget_name);
2627 return ret;
2628}
2629
2630static int taiko_codec_reset_interpolator(struct snd_soc_dapm_widget *w,
2631 struct snd_kcontrol *kcontrol, int event)
2632{
2633 struct snd_soc_codec *codec = w->codec;
2634
2635 pr_debug("%s %d %s\n", __func__, event, w->name);
2636
2637 switch (event) {
2638 case SND_SOC_DAPM_PRE_PMU:
2639 snd_soc_update_bits(codec, TAIKO_A_CDC_CLK_RX_RESET_CTL,
2640 1 << w->shift, 1 << w->shift);
2641 snd_soc_update_bits(codec, TAIKO_A_CDC_CLK_RX_RESET_CTL,
2642 1 << w->shift, 0x0);
2643 break;
2644 case SND_SOC_DAPM_POST_PMU:
2645 /* apply the digital gain after the interpolator is enabled*/
2646 if ((w->shift) < ARRAY_SIZE(rx_digital_gain_reg))
2647 snd_soc_write(codec,
2648 rx_digital_gain_reg[w->shift],
2649 snd_soc_read(codec,
2650 rx_digital_gain_reg[w->shift])
2651 );
2652 break;
2653 }
2654 return 0;
2655}
2656
2657static int taiko_codec_enable_ldo_h(struct snd_soc_dapm_widget *w,
2658 struct snd_kcontrol *kcontrol, int event)
2659{
2660 switch (event) {
2661 case SND_SOC_DAPM_POST_PMU:
2662 case SND_SOC_DAPM_POST_PMD:
2663 usleep_range(1000, 1000);
2664 break;
2665 }
2666 return 0;
2667}
2668
2669static int taiko_codec_enable_rx_bias(struct snd_soc_dapm_widget *w,
2670 struct snd_kcontrol *kcontrol, int event)
2671{
2672 struct snd_soc_codec *codec = w->codec;
2673
2674 pr_debug("%s %d\n", __func__, event);
2675
2676 switch (event) {
2677 case SND_SOC_DAPM_PRE_PMU:
2678 taiko_enable_rx_bias(codec, 1);
2679 break;
2680 case SND_SOC_DAPM_POST_PMD:
2681 taiko_enable_rx_bias(codec, 0);
2682 break;
2683 }
2684 return 0;
2685}
2686static int taiko_hphr_dac_event(struct snd_soc_dapm_widget *w,
2687 struct snd_kcontrol *kcontrol, int event)
2688{
2689 struct snd_soc_codec *codec = w->codec;
2690
2691 pr_debug("%s %s %d\n", __func__, w->name, event);
2692
2693 switch (event) {
2694 case SND_SOC_DAPM_PRE_PMU:
2695 snd_soc_update_bits(codec, w->reg, 0x40, 0x40);
2696 break;
2697 case SND_SOC_DAPM_POST_PMD:
2698 snd_soc_update_bits(codec, w->reg, 0x40, 0x00);
2699 break;
2700 }
2701 return 0;
2702}
2703
2704static void taiko_snd_soc_jack_report(struct taiko_priv *taiko,
2705 struct snd_soc_jack *jack, int status,
2706 int mask)
2707{
2708 /* XXX: wake_lock_timeout()? */
2709 snd_soc_jack_report_no_dapm(jack, status, mask);
2710}
2711
2712static void hphocp_off_report(struct taiko_priv *taiko,
2713 u32 jack_status, int irq)
2714{
2715 struct snd_soc_codec *codec;
2716 if (!taiko) {
2717 pr_err("%s: Bad taiko private data\n", __func__);
2718 return;
2719 }
2720
2721 pr_debug("%s: clear ocp status %x\n", __func__, jack_status);
2722 codec = taiko->codec;
2723 if (taiko->hph_status & jack_status) {
2724 taiko->hph_status &= ~jack_status;
2725 if (taiko->mbhc_cfg.headset_jack)
2726 taiko_snd_soc_jack_report(taiko,
2727 taiko->mbhc_cfg.headset_jack,
2728 taiko->hph_status,
2729 TAIKO_JACK_MASK);
2730 snd_soc_update_bits(codec, TAIKO_A_RX_HPH_OCP_CTL, 0x10, 0x00);
2731 snd_soc_update_bits(codec, TAIKO_A_RX_HPH_OCP_CTL, 0x10, 0x10);
2732 /* reset retry counter as PA is turned off signifying
2733 * start of new OCP detection session
2734 */
2735 if (TAIKO_IRQ_HPH_PA_OCPL_FAULT)
2736 taiko->hphlocp_cnt = 0;
2737 else
2738 taiko->hphrocp_cnt = 0;
2739 wcd9xxx_enable_irq(codec->control_data, irq);
2740 }
2741}
2742
2743static void hphlocp_off_report(struct work_struct *work)
2744{
2745 struct taiko_priv *taiko = container_of(work, struct taiko_priv,
2746 hphlocp_work);
2747 hphocp_off_report(taiko, SND_JACK_OC_HPHL, TAIKO_IRQ_HPH_PA_OCPL_FAULT);
2748}
2749
2750static void hphrocp_off_report(struct work_struct *work)
2751{
2752 struct taiko_priv *taiko = container_of(work, struct taiko_priv,
2753 hphrocp_work);
2754 hphocp_off_report(taiko, SND_JACK_OC_HPHR, TAIKO_IRQ_HPH_PA_OCPR_FAULT);
2755}
2756
2757static int taiko_hph_pa_event(struct snd_soc_dapm_widget *w,
2758 struct snd_kcontrol *kcontrol, int event)
2759{
2760 struct snd_soc_codec *codec = w->codec;
2761 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
2762 u8 mbhc_micb_ctl_val;
2763 pr_debug("%s: event = %d\n", __func__, event);
2764
2765 switch (event) {
2766 case SND_SOC_DAPM_PRE_PMU:
2767 mbhc_micb_ctl_val = snd_soc_read(codec,
2768 taiko->mbhc_bias_regs.ctl_reg);
2769
2770 if (!(mbhc_micb_ctl_val & 0x80)) {
2771 TAIKO_ACQUIRE_LOCK(taiko->codec_resource_lock);
2772 taiko_codec_switch_micbias(codec, 1);
2773 TAIKO_RELEASE_LOCK(taiko->codec_resource_lock);
2774 }
2775 break;
2776
2777 case SND_SOC_DAPM_POST_PMD:
2778 /* schedule work is required because at the time HPH PA DAPM
2779 * event callback is called by DAPM framework, CODEC dapm mutex
2780 * would have been locked while snd_soc_jack_report also
2781 * attempts to acquire same lock.
2782 */
2783 if (w->shift == 5) {
2784 clear_bit(TAIKO_HPHL_PA_OFF_ACK,
2785 &taiko->hph_pa_dac_state);
2786 clear_bit(TAIKO_HPHL_DAC_OFF_ACK,
2787 &taiko->hph_pa_dac_state);
2788 if (taiko->hph_status & SND_JACK_OC_HPHL)
2789 schedule_work(&taiko->hphlocp_work);
2790 } else if (w->shift == 4) {
2791 clear_bit(TAIKO_HPHR_PA_OFF_ACK,
2792 &taiko->hph_pa_dac_state);
2793 clear_bit(TAIKO_HPHR_DAC_OFF_ACK,
2794 &taiko->hph_pa_dac_state);
2795 if (taiko->hph_status & SND_JACK_OC_HPHR)
2796 schedule_work(&taiko->hphrocp_work);
2797 }
2798
2799 TAIKO_ACQUIRE_LOCK(taiko->codec_resource_lock);
2800 taiko_codec_switch_micbias(codec, 0);
2801 TAIKO_RELEASE_LOCK(taiko->codec_resource_lock);
2802
2803 pr_debug("%s: sleep 10 ms after %s PA disable.\n", __func__,
2804 w->name);
2805 usleep_range(10000, 10000);
2806 break;
2807 }
2808 return 0;
2809}
2810
2811static void taiko_get_mbhc_micbias_regs(struct snd_soc_codec *codec,
2812 struct mbhc_micbias_regs *micbias_regs)
2813{
2814 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
2815 unsigned int cfilt;
2816
2817 switch (taiko->mbhc_cfg.micbias) {
2818 case TAIKO_MICBIAS1:
2819 cfilt = taiko->pdata->micbias.bias1_cfilt_sel;
2820 micbias_regs->mbhc_reg = TAIKO_A_MICB_1_MBHC;
2821 micbias_regs->int_rbias = TAIKO_A_MICB_1_INT_RBIAS;
2822 micbias_regs->ctl_reg = TAIKO_A_MICB_1_CTL;
2823 break;
2824 case TAIKO_MICBIAS2:
2825 cfilt = taiko->pdata->micbias.bias2_cfilt_sel;
2826 micbias_regs->mbhc_reg = TAIKO_A_MICB_2_MBHC;
2827 micbias_regs->int_rbias = TAIKO_A_MICB_2_INT_RBIAS;
2828 micbias_regs->ctl_reg = TAIKO_A_MICB_2_CTL;
2829 break;
2830 case TAIKO_MICBIAS3:
2831 cfilt = taiko->pdata->micbias.bias3_cfilt_sel;
2832 micbias_regs->mbhc_reg = TAIKO_A_MICB_3_MBHC;
2833 micbias_regs->int_rbias = TAIKO_A_MICB_3_INT_RBIAS;
2834 micbias_regs->ctl_reg = TAIKO_A_MICB_3_CTL;
2835 break;
2836 case TAIKO_MICBIAS4:
2837 cfilt = taiko->pdata->micbias.bias4_cfilt_sel;
2838 micbias_regs->mbhc_reg = taiko->reg_addr.micb_4_mbhc;
2839 micbias_regs->int_rbias = taiko->reg_addr.micb_4_int_rbias;
2840 micbias_regs->ctl_reg = taiko->reg_addr.micb_4_ctl;
2841 break;
2842 default:
2843 /* Should never reach here */
2844 pr_err("%s: Invalid MIC BIAS for MBHC\n", __func__);
2845 return;
2846 }
2847
2848 micbias_regs->cfilt_sel = cfilt;
2849
2850 switch (cfilt) {
2851 case TAIKO_CFILT1_SEL:
2852 micbias_regs->cfilt_val = TAIKO_A_MICB_CFILT_1_VAL;
2853 micbias_regs->cfilt_ctl = TAIKO_A_MICB_CFILT_1_CTL;
2854 taiko->mbhc_data.micb_mv = taiko->pdata->micbias.cfilt1_mv;
2855 break;
2856 case TAIKO_CFILT2_SEL:
2857 micbias_regs->cfilt_val = TAIKO_A_MICB_CFILT_2_VAL;
2858 micbias_regs->cfilt_ctl = TAIKO_A_MICB_CFILT_2_CTL;
2859 taiko->mbhc_data.micb_mv = taiko->pdata->micbias.cfilt2_mv;
2860 break;
2861 case TAIKO_CFILT3_SEL:
2862 micbias_regs->cfilt_val = TAIKO_A_MICB_CFILT_3_VAL;
2863 micbias_regs->cfilt_ctl = TAIKO_A_MICB_CFILT_3_CTL;
2864 taiko->mbhc_data.micb_mv = taiko->pdata->micbias.cfilt3_mv;
2865 break;
2866 }
2867}
2868static const struct snd_soc_dapm_widget taiko_dapm_i2s_widgets[] = {
2869 SND_SOC_DAPM_SUPPLY("RX_I2S_CLK", TAIKO_A_CDC_CLK_RX_I2S_CTL,
2870 4, 0, NULL, 0),
2871 SND_SOC_DAPM_SUPPLY("TX_I2S_CLK", TAIKO_A_CDC_CLK_TX_I2S_CTL, 4,
2872 0, NULL, 0),
2873};
2874
2875static int taiko_lineout_dac_event(struct snd_soc_dapm_widget *w,
2876 struct snd_kcontrol *kcontrol, int event)
2877{
2878 struct snd_soc_codec *codec = w->codec;
2879
2880 pr_debug("%s %s %d\n", __func__, w->name, event);
2881
2882 switch (event) {
2883 case SND_SOC_DAPM_PRE_PMU:
2884 snd_soc_update_bits(codec, w->reg, 0x40, 0x40);
2885 break;
2886
2887 case SND_SOC_DAPM_POST_PMD:
2888 snd_soc_update_bits(codec, w->reg, 0x40, 0x00);
2889 break;
2890 }
2891 return 0;
2892}
2893
2894static const struct snd_soc_dapm_route audio_i2s_map[] = {
2895 {"RX_I2S_CLK", NULL, "CDC_CONN"},
2896 {"SLIM RX1", NULL, "RX_I2S_CLK"},
2897 {"SLIM RX2", NULL, "RX_I2S_CLK"},
2898 {"SLIM RX3", NULL, "RX_I2S_CLK"},
2899 {"SLIM RX4", NULL, "RX_I2S_CLK"},
2900
2901 {"SLIM TX7", NULL, "TX_I2S_CLK"},
2902 {"SLIM TX8", NULL, "TX_I2S_CLK"},
2903 {"SLIM TX9", NULL, "TX_I2S_CLK"},
2904 {"SLIM TX10", NULL, "TX_I2S_CLK"},
2905};
2906
2907static const struct snd_soc_dapm_route audio_map[] = {
2908 /* SLIMBUS Connections */
2909
2910 {"SLIM TX1", NULL, "SLIM TX1 MUX"},
2911 {"SLIM TX1 MUX", "DEC1", "DEC1 MUX"},
2912
2913 {"SLIM TX2", NULL, "SLIM TX2 MUX"},
2914 {"SLIM TX2 MUX", "DEC2", "DEC2 MUX"},
2915
2916 {"SLIM TX3", NULL, "SLIM TX3 MUX"},
2917 {"SLIM TX3 MUX", "DEC3", "DEC3 MUX"},
2918 {"SLIM TX3 MUX", "RMIX1", "RX1 MIX1"},
2919 {"SLIM TX3 MUX", "RMIX2", "RX2 MIX1"},
2920 {"SLIM TX3 MUX", "RMIX3", "RX3 MIX1"},
2921 {"SLIM TX3 MUX", "RMIX4", "RX4 MIX1"},
2922 {"SLIM TX3 MUX", "RMIX5", "RX5 MIX1"},
2923 {"SLIM TX3 MUX", "RMIX6", "RX6 MIX1"},
2924 {"SLIM TX3 MUX", "RMIX7", "RX7 MIX1"},
2925
2926 {"SLIM TX4", NULL, "SLIM TX4 MUX"},
2927 {"SLIM TX4 MUX", "DEC4", "DEC4 MUX"},
2928
2929 {"SLIM TX5", NULL, "SLIM TX5 MUX"},
2930 {"SLIM TX5 MUX", "DEC5", "DEC5 MUX"},
2931 {"SLIM TX5 MUX", "RMIX1", "RX1 MIX1"},
2932 {"SLIM TX5 MUX", "RMIX2", "RX2 MIX1"},
2933 {"SLIM TX5 MUX", "RMIX3", "RX3 MIX1"},
2934 {"SLIM TX5 MUX", "RMIX4", "RX4 MIX1"},
2935 {"SLIM TX5 MUX", "RMIX5", "RX5 MIX1"},
2936 {"SLIM TX5 MUX", "RMIX6", "RX6 MIX1"},
2937 {"SLIM TX5 MUX", "RMIX7", "RX7 MIX1"},
2938
2939 {"SLIM TX6", NULL, "SLIM TX6 MUX"},
2940 {"SLIM TX6 MUX", "DEC6", "DEC6 MUX"},
2941
2942 {"SLIM TX7", NULL, "SLIM TX7 MUX"},
2943 {"SLIM TX7 MUX", "DEC1", "DEC1 MUX"},
2944 {"SLIM TX7 MUX", "DEC2", "DEC2 MUX"},
2945 {"SLIM TX7 MUX", "DEC3", "DEC3 MUX"},
2946 {"SLIM TX7 MUX", "DEC4", "DEC4 MUX"},
2947 {"SLIM TX7 MUX", "DEC5", "DEC5 MUX"},
2948 {"SLIM TX7 MUX", "DEC6", "DEC6 MUX"},
2949 {"SLIM TX7 MUX", "DEC7", "DEC7 MUX"},
2950 {"SLIM TX7 MUX", "DEC8", "DEC8 MUX"},
2951 {"SLIM TX7 MUX", "DEC9", "DEC9 MUX"},
2952 {"SLIM TX7 MUX", "DEC10", "DEC10 MUX"},
2953 {"SLIM TX7 MUX", "RMIX1", "RX1 MIX1"},
2954 {"SLIM TX7 MUX", "RMIX2", "RX2 MIX1"},
2955 {"SLIM TX7 MUX", "RMIX3", "RX3 MIX1"},
2956 {"SLIM TX7 MUX", "RMIX4", "RX4 MIX1"},
2957 {"SLIM TX7 MUX", "RMIX5", "RX5 MIX1"},
2958 {"SLIM TX7 MUX", "RMIX6", "RX6 MIX1"},
2959 {"SLIM TX7 MUX", "RMIX7", "RX7 MIX1"},
2960
2961 {"SLIM TX8", NULL, "SLIM TX8 MUX"},
2962 {"SLIM TX8 MUX", "DEC1", "DEC1 MUX"},
2963 {"SLIM TX8 MUX", "DEC2", "DEC2 MUX"},
2964 {"SLIM TX8 MUX", "DEC3", "DEC3 MUX"},
2965 {"SLIM TX8 MUX", "DEC4", "DEC4 MUX"},
2966 {"SLIM TX8 MUX", "DEC5", "DEC5 MUX"},
2967 {"SLIM TX8 MUX", "DEC6", "DEC6 MUX"},
2968 {"SLIM TX8 MUX", "DEC7", "DEC7 MUX"},
2969 {"SLIM TX8 MUX", "DEC8", "DEC8 MUX"},
2970 {"SLIM TX8 MUX", "DEC9", "DEC9 MUX"},
2971 {"SLIM TX8 MUX", "DEC10", "DEC10 MUX"},
2972
2973 {"SLIM TX9", NULL, "SLIM TX9 MUX"},
2974 {"SLIM TX9 MUX", "DEC1", "DEC1 MUX"},
2975 {"SLIM TX9 MUX", "DEC2", "DEC2 MUX"},
2976 {"SLIM TX9 MUX", "DEC3", "DEC3 MUX"},
2977 {"SLIM TX9 MUX", "DEC4", "DEC4 MUX"},
2978 {"SLIM TX9 MUX", "DEC5", "DEC5 MUX"},
2979 {"SLIM TX9 MUX", "DEC6", "DEC6 MUX"},
2980 {"SLIM TX9 MUX", "DEC7", "DEC7 MUX"},
2981 {"SLIM TX9 MUX", "DEC8", "DEC8 MUX"},
2982 {"SLIM TX9 MUX", "DEC9", "DEC9 MUX"},
2983 {"SLIM TX9 MUX", "DEC10", "DEC10 MUX"},
2984
2985 {"SLIM TX10", NULL, "SLIM TX10 MUX"},
2986 {"SLIM TX10 MUX", "DEC1", "DEC1 MUX"},
2987 {"SLIM TX10 MUX", "DEC2", "DEC2 MUX"},
2988 {"SLIM TX10 MUX", "DEC3", "DEC3 MUX"},
2989 {"SLIM TX10 MUX", "DEC4", "DEC4 MUX"},
2990 {"SLIM TX10 MUX", "DEC5", "DEC5 MUX"},
2991 {"SLIM TX10 MUX", "DEC6", "DEC6 MUX"},
2992 {"SLIM TX10 MUX", "DEC7", "DEC7 MUX"},
2993 {"SLIM TX10 MUX", "DEC8", "DEC8 MUX"},
2994 {"SLIM TX10 MUX", "DEC9", "DEC9 MUX"},
2995 {"SLIM TX10 MUX", "DEC10", "DEC10 MUX"},
2996
2997 /* Earpiece (RX MIX1) */
2998 {"EAR", NULL, "EAR PA"},
2999 {"EAR PA", NULL, "EAR_PA_MIXER"},
3000 {"EAR_PA_MIXER", NULL, "DAC1"},
3001 {"DAC1", NULL, "CP"},
3002
3003 {"ANC1 FB MUX", "EAR_HPH_L", "RX1 MIX2"},
3004 {"ANC1 FB MUX", "EAR_LINE_1", "RX2 MIX2"},
3005 {"ANC", NULL, "ANC1 FB MUX"},
3006
3007 /* Headset (RX MIX1 and RX MIX2) */
3008 {"HEADPHONE", NULL, "HPHL"},
3009 {"HEADPHONE", NULL, "HPHR"},
3010
3011 {"HPHL", NULL, "HPHL_PA_MIXER"},
3012 {"HPHL_PA_MIXER", NULL, "HPHL DAC"},
3013
3014 {"HPHR", NULL, "HPHR_PA_MIXER"},
3015 {"HPHR_PA_MIXER", NULL, "HPHR DAC"},
3016
3017 {"HPHL DAC", NULL, "CP"},
3018 {"HPHR DAC", NULL, "CP"},
3019
3020 {"ANC", NULL, "ANC1 MUX"},
3021 {"ANC", NULL, "ANC2 MUX"},
3022 {"ANC1 MUX", "ADC1", "ADC1"},
3023 {"ANC1 MUX", "ADC2", "ADC2"},
3024 {"ANC1 MUX", "ADC3", "ADC3"},
3025 {"ANC1 MUX", "ADC4", "ADC4"},
3026 {"ANC2 MUX", "ADC1", "ADC1"},
3027 {"ANC2 MUX", "ADC2", "ADC2"},
3028 {"ANC2 MUX", "ADC3", "ADC3"},
3029 {"ANC2 MUX", "ADC4", "ADC4"},
3030
3031 {"ANC", NULL, "CDC_CONN"},
3032
3033 {"DAC1", "Switch", "RX1 CHAIN"},
3034 {"HPHL DAC", "Switch", "RX1 CHAIN"},
3035 {"HPHR DAC", NULL, "RX2 CHAIN"},
3036
3037 {"LINEOUT1", NULL, "LINEOUT1 PA"},
3038 {"LINEOUT2", NULL, "LINEOUT2 PA"},
3039 {"LINEOUT3", NULL, "LINEOUT3 PA"},
3040 {"LINEOUT4", NULL, "LINEOUT4 PA"},
3041
3042 {"LINEOUT1 PA", NULL, "LINEOUT1_PA_MIXER"},
3043 {"LINEOUT1_PA_MIXER", NULL, "LINEOUT1 DAC"},
3044 {"LINEOUT2 PA", NULL, "LINEOUT2_PA_MIXER"},
3045 {"LINEOUT2_PA_MIXER", NULL, "LINEOUT2 DAC"},
3046 {"LINEOUT3 PA", NULL, "LINEOUT3_PA_MIXER"},
3047 {"LINEOUT3_PA_MIXER", NULL, "LINEOUT3 DAC"},
3048 {"LINEOUT4 PA", NULL, "LINEOUT4_PA_MIXER"},
3049 {"LINEOUT4_PA_MIXER", NULL, "LINEOUT4 DAC"},
3050
3051 {"LINEOUT1 DAC", NULL, "RX3 MIX1"},
3052
3053 {"RX4 DSM MUX", "DSM_INV", "RX3 MIX1"},
3054 {"RX4 DSM MUX", "CIC_OUT", "RX4 MIX1"},
3055 {"LINEOUT3 DAC", NULL, "RX4 DSM MUX"},
3056
3057 {"LINEOUT2 DAC", NULL, "RX5 MIX1"},
3058
3059 {"RX6 DSM MUX", "DSM_INV", "RX5 MIX1"},
3060 {"RX6 DSM MUX", "CIC_OUT", "RX6 MIX1"},
3061 {"LINEOUT4 DAC", NULL, "RX6 DSM MUX"},
3062
3063 {"RX1 CHAIN", NULL, "RX1 MIX2"},
3064 {"RX2 CHAIN", NULL, "RX2 MIX2"},
3065 {"RX1 CHAIN", NULL, "ANC"},
3066 {"RX2 CHAIN", NULL, "ANC"},
3067
3068 {"CP", NULL, "RX_BIAS"},
3069 {"LINEOUT1 DAC", NULL, "RX_BIAS"},
3070 {"LINEOUT2 DAC", NULL, "RX_BIAS"},
3071 {"LINEOUT3 DAC", NULL, "RX_BIAS"},
3072 {"LINEOUT4 DAC", NULL, "RX_BIAS"},
3073
3074 {"RX1 MIX1", NULL, "COMP1_CLK"},
3075 {"RX2 MIX1", NULL, "COMP1_CLK"},
3076 {"RX3 MIX1", NULL, "COMP2_CLK"},
3077 {"RX5 MIX1", NULL, "COMP2_CLK"},
3078
3079
3080 {"RX1 MIX1", NULL, "RX1 MIX1 INP1"},
3081 {"RX1 MIX1", NULL, "RX1 MIX1 INP2"},
3082 {"RX1 MIX1", NULL, "RX1 MIX1 INP3"},
3083 {"RX2 MIX1", NULL, "RX2 MIX1 INP1"},
3084 {"RX2 MIX1", NULL, "RX2 MIX1 INP2"},
3085 {"RX3 MIX1", NULL, "RX3 MIX1 INP1"},
3086 {"RX3 MIX1", NULL, "RX3 MIX1 INP2"},
3087 {"RX4 MIX1", NULL, "RX4 MIX1 INP1"},
3088 {"RX4 MIX1", NULL, "RX4 MIX1 INP2"},
3089 {"RX5 MIX1", NULL, "RX5 MIX1 INP1"},
3090 {"RX5 MIX1", NULL, "RX5 MIX1 INP2"},
3091 {"RX6 MIX1", NULL, "RX6 MIX1 INP1"},
3092 {"RX6 MIX1", NULL, "RX6 MIX1 INP2"},
3093 {"RX7 MIX1", NULL, "RX7 MIX1 INP1"},
3094 {"RX7 MIX1", NULL, "RX7 MIX1 INP2"},
3095 {"RX1 MIX2", NULL, "RX1 MIX1"},
3096 {"RX1 MIX2", NULL, "RX1 MIX2 INP1"},
3097 {"RX1 MIX2", NULL, "RX1 MIX2 INP2"},
3098 {"RX2 MIX2", NULL, "RX2 MIX1"},
3099 {"RX2 MIX2", NULL, "RX2 MIX2 INP1"},
3100 {"RX2 MIX2", NULL, "RX2 MIX2 INP2"},
3101 {"RX7 MIX2", NULL, "RX7 MIX1"},
3102 {"RX7 MIX2", NULL, "RX7 MIX2 INP1"},
3103 {"RX7 MIX2", NULL, "RX7 MIX2 INP2"},
3104
3105 {"RX1 MIX1 INP1", "RX1", "SLIM RX1"},
3106 {"RX1 MIX1 INP1", "RX2", "SLIM RX2"},
3107 {"RX1 MIX1 INP1", "RX3", "SLIM RX3"},
3108 {"RX1 MIX1 INP1", "RX4", "SLIM RX4"},
3109 {"RX1 MIX1 INP1", "RX5", "SLIM RX5"},
3110 {"RX1 MIX1 INP1", "RX6", "SLIM RX6"},
3111 {"RX1 MIX1 INP1", "RX7", "SLIM RX7"},
3112 {"RX1 MIX1 INP1", "IIR1", "IIR1"},
3113 {"RX1 MIX1 INP2", "RX1", "SLIM RX1"},
3114 {"RX1 MIX1 INP2", "RX2", "SLIM RX2"},
3115 {"RX1 MIX1 INP2", "RX3", "SLIM RX3"},
3116 {"RX1 MIX1 INP2", "RX4", "SLIM RX4"},
3117 {"RX1 MIX1 INP2", "RX5", "SLIM RX5"},
3118 {"RX1 MIX1 INP2", "RX6", "SLIM RX6"},
3119 {"RX1 MIX1 INP2", "RX7", "SLIM RX7"},
3120 {"RX1 MIX1 INP2", "IIR1", "IIR1"},
3121 {"RX1 MIX1 INP3", "RX1", "SLIM RX1"},
3122 {"RX1 MIX1 INP3", "RX2", "SLIM RX2"},
3123 {"RX1 MIX1 INP3", "RX3", "SLIM RX3"},
3124 {"RX1 MIX1 INP3", "RX4", "SLIM RX4"},
3125 {"RX1 MIX1 INP3", "RX5", "SLIM RX5"},
3126 {"RX1 MIX1 INP3", "RX6", "SLIM RX6"},
3127 {"RX1 MIX1 INP3", "RX7", "SLIM RX7"},
3128 {"RX2 MIX1 INP1", "RX1", "SLIM RX1"},
3129 {"RX2 MIX1 INP1", "RX2", "SLIM RX2"},
3130 {"RX2 MIX1 INP1", "RX3", "SLIM RX3"},
3131 {"RX2 MIX1 INP1", "RX4", "SLIM RX4"},
3132 {"RX2 MIX1 INP1", "RX5", "SLIM RX5"},
3133 {"RX2 MIX1 INP1", "RX6", "SLIM RX6"},
3134 {"RX2 MIX1 INP1", "RX7", "SLIM RX7"},
3135 {"RX2 MIX1 INP1", "IIR1", "IIR1"},
3136 {"RX2 MIX1 INP2", "RX1", "SLIM RX1"},
3137 {"RX2 MIX1 INP2", "RX2", "SLIM RX2"},
3138 {"RX2 MIX1 INP2", "RX3", "SLIM RX3"},
3139 {"RX2 MIX1 INP2", "RX4", "SLIM RX4"},
3140 {"RX2 MIX1 INP2", "RX5", "SLIM RX5"},
3141 {"RX2 MIX1 INP2", "RX6", "SLIM RX6"},
3142 {"RX2 MIX1 INP2", "RX7", "SLIM RX7"},
3143 {"RX2 MIX1 INP2", "IIR1", "IIR1"},
3144 {"RX3 MIX1 INP1", "RX1", "SLIM RX1"},
3145 {"RX3 MIX1 INP1", "RX2", "SLIM RX2"},
3146 {"RX3 MIX1 INP1", "RX3", "SLIM RX3"},
3147 {"RX3 MIX1 INP1", "RX4", "SLIM RX4"},
3148 {"RX3 MIX1 INP1", "RX5", "SLIM RX5"},
3149 {"RX3 MIX1 INP1", "RX6", "SLIM RX6"},
3150 {"RX3 MIX1 INP1", "RX7", "SLIM RX7"},
3151 {"RX3 MIX1 INP1", "IIR1", "IIR1"},
3152 {"RX3 MIX1 INP2", "RX1", "SLIM RX1"},
3153 {"RX3 MIX1 INP2", "RX2", "SLIM RX2"},
3154 {"RX3 MIX1 INP2", "RX3", "SLIM RX3"},
3155 {"RX3 MIX1 INP2", "RX4", "SLIM RX4"},
3156 {"RX3 MIX1 INP2", "RX5", "SLIM RX5"},
3157 {"RX3 MIX1 INP2", "RX6", "SLIM RX6"},
3158 {"RX3 MIX1 INP2", "RX7", "SLIM RX7"},
3159 {"RX3 MIX1 INP2", "IIR1", "IIR1"},
3160 {"RX4 MIX1 INP1", "RX1", "SLIM RX1"},
3161 {"RX4 MIX1 INP1", "RX2", "SLIM RX2"},
3162 {"RX4 MIX1 INP1", "RX3", "SLIM RX3"},
3163 {"RX4 MIX1 INP1", "RX4", "SLIM RX4"},
3164 {"RX4 MIX1 INP1", "RX5", "SLIM RX5"},
3165 {"RX4 MIX1 INP1", "RX6", "SLIM RX6"},
3166 {"RX4 MIX1 INP1", "RX7", "SLIM RX7"},
3167 {"RX4 MIX1 INP1", "IIR1", "IIR1"},
3168 {"RX4 MIX1 INP2", "RX1", "SLIM RX1"},
3169 {"RX4 MIX1 INP2", "RX2", "SLIM RX2"},
3170 {"RX4 MIX1 INP2", "RX3", "SLIM RX3"},
3171 {"RX4 MIX1 INP2", "RX5", "SLIM RX5"},
3172 {"RX4 MIX1 INP2", "RX4", "SLIM RX4"},
3173 {"RX4 MIX1 INP2", "RX6", "SLIM RX6"},
3174 {"RX4 MIX1 INP2", "RX7", "SLIM RX7"},
3175 {"RX4 MIX1 INP2", "IIR1", "IIR1"},
3176 {"RX5 MIX1 INP1", "RX1", "SLIM RX1"},
3177 {"RX5 MIX1 INP1", "RX2", "SLIM RX2"},
3178 {"RX5 MIX1 INP1", "RX3", "SLIM RX3"},
3179 {"RX5 MIX1 INP1", "RX4", "SLIM RX4"},
3180 {"RX5 MIX1 INP1", "RX5", "SLIM RX5"},
3181 {"RX5 MIX1 INP1", "RX6", "SLIM RX6"},
3182 {"RX5 MIX1 INP1", "RX7", "SLIM RX7"},
3183 {"RX5 MIX1 INP1", "IIR1", "IIR1"},
3184 {"RX5 MIX1 INP2", "RX1", "SLIM RX1"},
3185 {"RX5 MIX1 INP2", "RX2", "SLIM RX2"},
3186 {"RX5 MIX1 INP2", "RX3", "SLIM RX3"},
3187 {"RX5 MIX1 INP2", "RX4", "SLIM RX4"},
3188 {"RX5 MIX1 INP2", "RX5", "SLIM RX5"},
3189 {"RX5 MIX1 INP2", "RX6", "SLIM RX6"},
3190 {"RX5 MIX1 INP2", "RX7", "SLIM RX7"},
3191 {"RX5 MIX1 INP2", "IIR1", "IIR1"},
3192 {"RX6 MIX1 INP1", "RX1", "SLIM RX1"},
3193 {"RX6 MIX1 INP1", "RX2", "SLIM RX2"},
3194 {"RX6 MIX1 INP1", "RX3", "SLIM RX3"},
3195 {"RX6 MIX1 INP1", "RX4", "SLIM RX4"},
3196 {"RX6 MIX1 INP1", "RX5", "SLIM RX5"},
3197 {"RX6 MIX1 INP1", "RX6", "SLIM RX6"},
3198 {"RX6 MIX1 INP1", "RX7", "SLIM RX7"},
3199 {"RX6 MIX1 INP1", "IIR1", "IIR1"},
3200 {"RX6 MIX1 INP2", "RX1", "SLIM RX1"},
3201 {"RX6 MIX1 INP2", "RX2", "SLIM RX2"},
3202 {"RX6 MIX1 INP2", "RX3", "SLIM RX3"},
3203 {"RX6 MIX1 INP2", "RX4", "SLIM RX4"},
3204 {"RX6 MIX1 INP2", "RX5", "SLIM RX5"},
3205 {"RX6 MIX1 INP2", "RX6", "SLIM RX6"},
3206 {"RX6 MIX1 INP2", "RX7", "SLIM RX7"},
3207 {"RX6 MIX1 INP2", "IIR1", "IIR1"},
3208 {"RX7 MIX1 INP1", "RX1", "SLIM RX1"},
3209 {"RX7 MIX1 INP1", "RX2", "SLIM RX2"},
3210 {"RX7 MIX1 INP1", "RX3", "SLIM RX3"},
3211 {"RX7 MIX1 INP1", "RX4", "SLIM RX4"},
3212 {"RX7 MIX1 INP1", "RX5", "SLIM RX5"},
3213 {"RX7 MIX1 INP1", "RX6", "SLIM RX6"},
3214 {"RX7 MIX1 INP1", "RX7", "SLIM RX7"},
3215 {"RX7 MIX1 INP1", "IIR1", "IIR1"},
3216 {"RX7 MIX1 INP2", "RX1", "SLIM RX1"},
3217 {"RX7 MIX1 INP2", "RX2", "SLIM RX2"},
3218 {"RX7 MIX1 INP2", "RX3", "SLIM RX3"},
3219 {"RX7 MIX1 INP2", "RX4", "SLIM RX4"},
3220 {"RX7 MIX1 INP2", "RX5", "SLIM RX5"},
3221 {"RX7 MIX1 INP2", "RX6", "SLIM RX6"},
3222 {"RX7 MIX1 INP2", "RX7", "SLIM RX7"},
3223 {"RX7 MIX1 INP2", "IIR1", "IIR1"},
3224 {"RX1 MIX2 INP1", "IIR1", "IIR1"},
3225 {"RX1 MIX2 INP2", "IIR1", "IIR1"},
3226 {"RX2 MIX2 INP1", "IIR1", "IIR1"},
3227 {"RX2 MIX2 INP2", "IIR1", "IIR1"},
3228 {"RX7 MIX2 INP1", "IIR1", "IIR1"},
3229 {"RX7 MIX2 INP2", "IIR1", "IIR1"},
3230
3231 /* Decimator Inputs */
3232 {"DEC1 MUX", "DMIC1", "DMIC1"},
3233 {"DEC1 MUX", "ADC6", "ADC6"},
3234 {"DEC1 MUX", NULL, "CDC_CONN"},
3235 {"DEC2 MUX", "DMIC2", "DMIC2"},
3236 {"DEC2 MUX", "ADC5", "ADC5"},
3237 {"DEC2 MUX", NULL, "CDC_CONN"},
3238 {"DEC3 MUX", "DMIC3", "DMIC3"},
3239 {"DEC3 MUX", "ADC4", "ADC4"},
3240 {"DEC3 MUX", NULL, "CDC_CONN"},
3241 {"DEC4 MUX", "DMIC4", "DMIC4"},
3242 {"DEC4 MUX", "ADC3", "ADC3"},
3243 {"DEC4 MUX", NULL, "CDC_CONN"},
3244 {"DEC5 MUX", "DMIC5", "DMIC5"},
3245 {"DEC5 MUX", "ADC2", "ADC2"},
3246 {"DEC5 MUX", NULL, "CDC_CONN"},
3247 {"DEC6 MUX", "DMIC6", "DMIC6"},
3248 {"DEC6 MUX", "ADC1", "ADC1"},
3249 {"DEC6 MUX", NULL, "CDC_CONN"},
3250 {"DEC7 MUX", "DMIC1", "DMIC1"},
3251 {"DEC7 MUX", "DMIC6", "DMIC6"},
3252 {"DEC7 MUX", "ADC1", "ADC1"},
3253 {"DEC7 MUX", "ADC6", "ADC6"},
3254 {"DEC7 MUX", NULL, "CDC_CONN"},
3255 {"DEC8 MUX", "DMIC2", "DMIC2"},
3256 {"DEC8 MUX", "DMIC5", "DMIC5"},
3257 {"DEC8 MUX", "ADC2", "ADC2"},
3258 {"DEC8 MUX", "ADC5", "ADC5"},
3259 {"DEC8 MUX", NULL, "CDC_CONN"},
3260 {"DEC9 MUX", "DMIC4", "DMIC4"},
3261 {"DEC9 MUX", "DMIC5", "DMIC5"},
3262 {"DEC9 MUX", "ADC2", "ADC2"},
3263 {"DEC9 MUX", "ADC3", "ADC3"},
3264 {"DEC9 MUX", NULL, "CDC_CONN"},
3265 {"DEC10 MUX", "DMIC3", "DMIC3"},
3266 {"DEC10 MUX", "DMIC6", "DMIC6"},
3267 {"DEC10 MUX", "ADC1", "ADC1"},
3268 {"DEC10 MUX", "ADC4", "ADC4"},
3269 {"DEC10 MUX", NULL, "CDC_CONN"},
3270
3271 /* ADC Connections */
3272 {"ADC1", NULL, "AMIC1"},
3273 {"ADC2", NULL, "AMIC2"},
3274 {"ADC3", NULL, "AMIC3"},
3275 {"ADC4", NULL, "AMIC4"},
3276 {"ADC5", NULL, "AMIC5"},
3277 {"ADC6", NULL, "AMIC6"},
3278
3279 /* AUX PGA Connections */
3280 {"HPHL_PA_MIXER", "AUX_PGA_L Switch", "AUX_PGA_Left"},
3281 {"HPHL_PA_MIXER", "AUX_PGA_R Switch", "AUX_PGA_Right"},
3282 {"HPHL_PA_MIXER", "AUX_PGA_L_INV Switch", "AUX_PGA_Left"},
3283 {"HPHL_PA_MIXER", "AUX_PGA_R_INV Switch", "AUX_PGA_Right"},
3284 {"HPHR_PA_MIXER", "AUX_PGA_L Switch", "AUX_PGA_Left"},
3285 {"HPHR_PA_MIXER", "AUX_PGA_R Switch", "AUX_PGA_Right"},
3286 {"HPHR_PA_MIXER", "AUX_PGA_L_INV Switch", "AUX_PGA_Left"},
3287 {"HPHR_PA_MIXER", "AUX_PGA_R_INV Switch", "AUX_PGA_Right"},
3288 {"LINEOUT1_PA_MIXER", "AUX_PGA_L Switch", "AUX_PGA_Left"},
3289 {"LINEOUT1_PA_MIXER", "AUX_PGA_R Switch", "AUX_PGA_Right"},
3290 {"LINEOUT1_PA_MIXER", "AUX_PGA_L_INV Switch", "AUX_PGA_Left"},
3291 {"LINEOUT1_PA_MIXER", "AUX_PGA_R_INV Switch", "AUX_PGA_Right"},
3292 {"LINEOUT2_PA_MIXER", "AUX_PGA_L Switch", "AUX_PGA_Left"},
3293 {"LINEOUT2_PA_MIXER", "AUX_PGA_R Switch", "AUX_PGA_Right"},
3294 {"LINEOUT2_PA_MIXER", "AUX_PGA_L_INV Switch", "AUX_PGA_Left"},
3295 {"LINEOUT2_PA_MIXER", "AUX_PGA_R_INV Switch", "AUX_PGA_Right"},
3296 {"LINEOUT3_PA_MIXER", "AUX_PGA_L Switch", "AUX_PGA_Left"},
3297 {"LINEOUT3_PA_MIXER", "AUX_PGA_R Switch", "AUX_PGA_Right"},
3298 {"LINEOUT3_PA_MIXER", "AUX_PGA_L_INV Switch", "AUX_PGA_Left"},
3299 {"LINEOUT3_PA_MIXER", "AUX_PGA_R_INV Switch", "AUX_PGA_Right"},
3300 {"LINEOUT4_PA_MIXER", "AUX_PGA_L Switch", "AUX_PGA_Left"},
3301 {"LINEOUT4_PA_MIXER", "AUX_PGA_R Switch", "AUX_PGA_Right"},
3302 {"LINEOUT4_PA_MIXER", "AUX_PGA_L_INV Switch", "AUX_PGA_Left"},
3303 {"LINEOUT4_PA_MIXER", "AUX_PGA_R_INV Switch", "AUX_PGA_Right"},
3304 {"EAR_PA_MIXER", "AUX_PGA_L Switch", "AUX_PGA_Left"},
3305 {"EAR_PA_MIXER", "AUX_PGA_R Switch", "AUX_PGA_Right"},
3306 {"EAR_PA_MIXER", "AUX_PGA_L_INV Switch", "AUX_PGA_Left"},
3307 {"EAR_PA_MIXER", "AUX_PGA_R_INV Switch", "AUX_PGA_Right"},
3308 {"AUX_PGA_Left", NULL, "AMIC5"},
3309 {"AUX_PGA_Right", NULL, "AMIC6"},
3310
3311
3312 {"IIR1", NULL, "IIR1 INP1 MUX"},
3313 {"IIR1 INP1 MUX", "DEC1", "DEC1 MUX"},
3314 {"IIR1 INP1 MUX", "DEC2", "DEC2 MUX"},
3315 {"IIR1 INP1 MUX", "DEC3", "DEC3 MUX"},
3316 {"IIR1 INP1 MUX", "DEC4", "DEC4 MUX"},
3317 {"IIR1 INP1 MUX", "DEC5", "DEC5 MUX"},
3318 {"IIR1 INP1 MUX", "DEC6", "DEC6 MUX"},
3319 {"IIR1 INP1 MUX", "DEC7", "DEC7 MUX"},
3320 {"IIR1 INP1 MUX", "DEC8", "DEC8 MUX"},
3321 {"IIR1 INP1 MUX", "DEC9", "DEC9 MUX"},
3322 {"IIR1 INP1 MUX", "DEC10", "DEC10 MUX"},
3323
3324 {"MIC BIAS1 Internal1", NULL, "LDO_H"},
3325 {"MIC BIAS1 Internal2", NULL, "LDO_H"},
3326 {"MIC BIAS1 External", NULL, "LDO_H"},
3327 {"MIC BIAS2 Internal1", NULL, "LDO_H"},
3328 {"MIC BIAS2 Internal2", NULL, "LDO_H"},
3329 {"MIC BIAS2 Internal3", NULL, "LDO_H"},
3330 {"MIC BIAS2 External", NULL, "LDO_H"},
3331 {"MIC BIAS3 Internal1", NULL, "LDO_H"},
3332 {"MIC BIAS3 Internal2", NULL, "LDO_H"},
3333 {"MIC BIAS3 External", NULL, "LDO_H"},
3334 {"MIC BIAS4 External", NULL, "LDO_H"},
3335};
3336
3337static int taiko_readable(struct snd_soc_codec *ssc, unsigned int reg)
3338{
3339 return taiko_reg_readable[reg];
3340}
3341
3342static bool taiko_is_digital_gain_register(unsigned int reg)
3343{
3344 bool rtn = false;
3345 switch (reg) {
3346 case TAIKO_A_CDC_RX1_VOL_CTL_B2_CTL:
3347 case TAIKO_A_CDC_RX2_VOL_CTL_B2_CTL:
3348 case TAIKO_A_CDC_RX3_VOL_CTL_B2_CTL:
3349 case TAIKO_A_CDC_RX4_VOL_CTL_B2_CTL:
3350 case TAIKO_A_CDC_RX5_VOL_CTL_B2_CTL:
3351 case TAIKO_A_CDC_RX6_VOL_CTL_B2_CTL:
3352 case TAIKO_A_CDC_RX7_VOL_CTL_B2_CTL:
3353 case TAIKO_A_CDC_TX1_VOL_CTL_GAIN:
3354 case TAIKO_A_CDC_TX2_VOL_CTL_GAIN:
3355 case TAIKO_A_CDC_TX3_VOL_CTL_GAIN:
3356 case TAIKO_A_CDC_TX4_VOL_CTL_GAIN:
3357 case TAIKO_A_CDC_TX5_VOL_CTL_GAIN:
3358 case TAIKO_A_CDC_TX6_VOL_CTL_GAIN:
3359 case TAIKO_A_CDC_TX7_VOL_CTL_GAIN:
3360 case TAIKO_A_CDC_TX8_VOL_CTL_GAIN:
3361 case TAIKO_A_CDC_TX9_VOL_CTL_GAIN:
3362 case TAIKO_A_CDC_TX10_VOL_CTL_GAIN:
3363 rtn = true;
3364 break;
3365 default:
3366 break;
3367 }
3368 return rtn;
3369}
3370
3371static int taiko_volatile(struct snd_soc_codec *ssc, unsigned int reg)
3372{
3373 /* Registers lower than 0x100 are top level registers which can be
3374 * written by the Taiko core driver.
3375 */
3376
3377 if ((reg >= TAIKO_A_CDC_MBHC_EN_CTL) || (reg < 0x100))
3378 return 1;
3379
3380 /* IIR Coeff registers are not cacheable */
3381 if ((reg >= TAIKO_A_CDC_IIR1_COEF_B1_CTL) &&
3382 (reg <= TAIKO_A_CDC_IIR2_COEF_B2_CTL))
3383 return 1;
3384
3385 /* Digital gain register is not cacheable so we have to write
3386 * the setting even it is the same
3387 */
3388 if (taiko_is_digital_gain_register(reg))
3389 return 1;
3390
3391 /* HPH status registers */
3392 if (reg == TAIKO_A_RX_HPH_L_STATUS || reg == TAIKO_A_RX_HPH_R_STATUS)
3393 return 1;
3394
3395 return 0;
3396}
3397
3398#define TAIKO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE)
3399static int taiko_write(struct snd_soc_codec *codec, unsigned int reg,
3400 unsigned int value)
3401{
3402 int ret;
3403 BUG_ON(reg > TAIKO_MAX_REGISTER);
3404
3405 if (!taiko_volatile(codec, reg)) {
3406 ret = snd_soc_cache_write(codec, reg, value);
3407 if (ret != 0)
3408 dev_err(codec->dev, "Cache write to %x failed: %d\n",
3409 reg, ret);
3410 }
3411
3412 return wcd9xxx_reg_write(codec->control_data, reg, value);
3413}
3414static unsigned int taiko_read(struct snd_soc_codec *codec,
3415 unsigned int reg)
3416{
3417 unsigned int val;
3418 int ret;
3419
3420 BUG_ON(reg > TAIKO_MAX_REGISTER);
3421
3422 if (!taiko_volatile(codec, reg) && taiko_readable(codec, reg) &&
3423 reg < codec->driver->reg_cache_size) {
3424 ret = snd_soc_cache_read(codec, reg, &val);
3425 if (ret >= 0) {
3426 return val;
3427 } else
3428 dev_err(codec->dev, "Cache read from %x failed: %d\n",
3429 reg, ret);
3430 }
3431
3432 val = wcd9xxx_reg_read(codec->control_data, reg);
3433 return val;
3434}
3435
3436static s16 taiko_get_current_v_ins(struct taiko_priv *taiko, bool hu)
3437{
3438 s16 v_ins;
3439 if ((taiko->mbhc_data.micb_mv != VDDIO_MICBIAS_MV) &&
3440 taiko->mbhc_micbias_switched)
3441 v_ins = hu ? (s16)taiko->mbhc_data.adj_v_ins_hu :
3442 (s16)taiko->mbhc_data.adj_v_ins_h;
3443 else
3444 v_ins = hu ? (s16)taiko->mbhc_data.v_ins_hu :
3445 (s16)taiko->mbhc_data.v_ins_h;
3446 return v_ins;
3447}
3448
3449static s16 taiko_get_current_v_hs_max(struct taiko_priv *taiko)
3450{
3451 s16 v_hs_max;
3452 struct taiko_mbhc_plug_type_cfg *plug_type;
3453
3454 plug_type = TAIKO_MBHC_CAL_PLUG_TYPE_PTR(taiko->mbhc_cfg.calibration);
3455 if ((taiko->mbhc_data.micb_mv != VDDIO_MICBIAS_MV) &&
3456 taiko->mbhc_micbias_switched)
3457 v_hs_max = taiko->mbhc_data.adj_v_hs_max;
3458 else
3459 v_hs_max = plug_type->v_hs_max;
3460 return v_hs_max;
3461}
3462
3463static void taiko_codec_calibrate_hs_polling(struct snd_soc_codec *codec)
3464{
3465 u8 *n_ready, *n_cic;
3466 struct taiko_mbhc_btn_detect_cfg *btn_det;
3467 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
3468 const s16 v_ins_hu = taiko_get_current_v_ins(taiko, true);
3469
3470 btn_det = TAIKO_MBHC_CAL_BTN_DET_PTR(taiko->mbhc_cfg.calibration);
3471
3472 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B1_CTL,
3473 v_ins_hu & 0xFF);
3474 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B2_CTL,
3475 (v_ins_hu >> 8) & 0xFF);
3476
3477 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B3_CTL,
3478 taiko->mbhc_data.v_b1_hu & 0xFF);
3479 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B4_CTL,
3480 (taiko->mbhc_data.v_b1_hu >> 8) & 0xFF);
3481
3482 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B5_CTL,
3483 taiko->mbhc_data.v_b1_h & 0xFF);
3484 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B6_CTL,
3485 (taiko->mbhc_data.v_b1_h >> 8) & 0xFF);
3486
3487 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B9_CTL,
3488 taiko->mbhc_data.v_brh & 0xFF);
3489 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B10_CTL,
3490 (taiko->mbhc_data.v_brh >> 8) & 0xFF);
3491
3492 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B11_CTL,
3493 taiko->mbhc_data.v_brl & 0xFF);
3494 snd_soc_write(codec, TAIKO_A_CDC_MBHC_VOLT_B12_CTL,
3495 (taiko->mbhc_data.v_brl >> 8) & 0xFF);
3496
3497 n_ready = taiko_mbhc_cal_btn_det_mp(btn_det, TAIKO_BTN_DET_N_READY);
3498 snd_soc_write(codec, TAIKO_A_CDC_MBHC_TIMER_B1_CTL,
3499 n_ready[taiko_codec_mclk_index(taiko)]);
3500 snd_soc_write(codec, TAIKO_A_CDC_MBHC_TIMER_B2_CTL,
3501 taiko->mbhc_data.npoll);
3502 snd_soc_write(codec, TAIKO_A_CDC_MBHC_TIMER_B3_CTL,
3503 taiko->mbhc_data.nbounce_wait);
3504 n_cic = taiko_mbhc_cal_btn_det_mp(btn_det, TAIKO_BTN_DET_N_CIC);
3505 snd_soc_write(codec, TAIKO_A_CDC_MBHC_TIMER_B6_CTL,
3506 n_cic[taiko_codec_mclk_index(taiko)]);
3507}
3508
3509static int taiko_startup(struct snd_pcm_substream *substream,
3510 struct snd_soc_dai *dai)
3511{
3512 struct wcd9xxx *taiko_core = dev_get_drvdata(dai->codec->dev->parent);
3513 pr_debug("%s(): substream = %s stream = %d\n" , __func__,
3514 substream->name, substream->stream);
3515 if ((taiko_core != NULL) &&
3516 (taiko_core->dev != NULL) &&
3517 (taiko_core->dev->parent != NULL))
3518 pm_runtime_get_sync(taiko_core->dev->parent);
3519
3520 return 0;
3521}
3522
3523static void taiko_shutdown(struct snd_pcm_substream *substream,
3524 struct snd_soc_dai *dai)
3525{
3526 struct wcd9xxx *taiko_core = dev_get_drvdata(dai->codec->dev->parent);
3527 pr_debug("%s(): substream = %s stream = %d\n" , __func__,
3528 substream->name, substream->stream);
3529 if ((taiko_core != NULL) &&
3530 (taiko_core->dev != NULL) &&
3531 (taiko_core->dev->parent != NULL)) {
3532 pm_runtime_mark_last_busy(taiko_core->dev->parent);
3533 pm_runtime_put(taiko_core->dev->parent);
3534 }
3535}
3536
3537int taiko_mclk_enable(struct snd_soc_codec *codec, int mclk_enable, bool dapm)
3538{
3539 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
3540
3541 pr_debug("%s: mclk_enable = %u, dapm = %d\n", __func__, mclk_enable,
3542 dapm);
3543 if (dapm)
3544 TAIKO_ACQUIRE_LOCK(taiko->codec_resource_lock);
3545 if (mclk_enable) {
3546 taiko->mclk_enabled = true;
3547
3548 if (taiko->mbhc_polling_active) {
3549 taiko_codec_pause_hs_polling(codec);
3550 taiko_codec_disable_clock_block(codec);
3551 taiko_codec_enable_bandgap(codec,
3552 TAIKO_BANDGAP_AUDIO_MODE);
3553 taiko_codec_enable_clock_block(codec, 0);
3554 taiko_codec_calibrate_hs_polling(codec);
3555 taiko_codec_start_hs_polling(codec);
3556 } else {
3557 taiko_codec_disable_clock_block(codec);
3558 taiko_codec_enable_bandgap(codec,
3559 TAIKO_BANDGAP_AUDIO_MODE);
3560 taiko_codec_enable_clock_block(codec, 0);
3561 }
3562 } else {
3563
3564 if (!taiko->mclk_enabled) {
3565 if (dapm)
3566 TAIKO_RELEASE_LOCK(taiko->codec_resource_lock);
3567 pr_err("Error, MCLK already diabled\n");
3568 return -EINVAL;
3569 }
3570 taiko->mclk_enabled = false;
3571
3572 if (taiko->mbhc_polling_active) {
3573 taiko_codec_pause_hs_polling(codec);
3574 taiko_codec_disable_clock_block(codec);
3575 taiko_codec_enable_bandgap(codec,
3576 TAIKO_BANDGAP_MBHC_MODE);
3577 taiko_enable_rx_bias(codec, 1);
3578 taiko_codec_enable_clock_block(codec, 1);
3579 taiko_codec_calibrate_hs_polling(codec);
3580 taiko_codec_start_hs_polling(codec);
3581 snd_soc_update_bits(codec, TAIKO_A_CLK_BUFF_EN1,
3582 0x05, 0x01);
3583 } else {
3584 taiko_codec_disable_clock_block(codec);
3585 taiko_codec_enable_bandgap(codec,
3586 TAIKO_BANDGAP_OFF);
3587 }
3588 }
3589 if (dapm)
3590 TAIKO_RELEASE_LOCK(taiko->codec_resource_lock);
3591 return 0;
3592}
3593
3594static int taiko_set_dai_sysclk(struct snd_soc_dai *dai,
3595 int clk_id, unsigned int freq, int dir)
3596{
3597 pr_debug("%s\n", __func__);
3598 return 0;
3599}
3600
3601static int taiko_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
3602{
3603 u8 val = 0;
3604 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(dai->codec);
3605
3606 pr_debug("%s\n", __func__);
3607 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
3608 case SND_SOC_DAIFMT_CBS_CFS:
3609 /* CPU is master */
3610 if (taiko->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) {
3611 if (dai->id == AIF1_CAP)
3612 snd_soc_update_bits(dai->codec,
3613 TAIKO_A_CDC_CLK_TX_I2S_CTL,
3614 TAIKO_I2S_MASTER_MODE_MASK, 0);
3615 else if (dai->id == AIF1_PB)
3616 snd_soc_update_bits(dai->codec,
3617 TAIKO_A_CDC_CLK_RX_I2S_CTL,
3618 TAIKO_I2S_MASTER_MODE_MASK, 0);
3619 }
3620 break;
3621 case SND_SOC_DAIFMT_CBM_CFM:
3622 /* CPU is slave */
3623 if (taiko->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) {
3624 val = TAIKO_I2S_MASTER_MODE_MASK;
3625 if (dai->id == AIF1_CAP)
3626 snd_soc_update_bits(dai->codec,
3627 TAIKO_A_CDC_CLK_TX_I2S_CTL, val, val);
3628 else if (dai->id == AIF1_PB)
3629 snd_soc_update_bits(dai->codec,
3630 TAIKO_A_CDC_CLK_RX_I2S_CTL, val, val);
3631 }
3632 break;
3633 default:
3634 return -EINVAL;
3635 }
3636 return 0;
3637}
3638
3639static int taiko_set_channel_map(struct snd_soc_dai *dai,
3640 unsigned int tx_num, unsigned int *tx_slot,
3641 unsigned int rx_num, unsigned int *rx_slot)
3642
3643{
3644 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(dai->codec);
3645 u32 i = 0;
3646 if (!tx_slot && !rx_slot) {
3647 pr_err("%s: Invalid\n", __func__);
3648 return -EINVAL;
3649 }
3650 pr_debug("%s(): dai_name = %s DAI-ID %x tx_ch %d rx_ch %d\n",
3651 __func__, dai->name, dai->id, tx_num, rx_num);
3652
3653 if (dai->id == AIF1_PB || dai->id == AIF2_PB || dai->id == AIF3_PB) {
3654 for (i = 0; i < rx_num; i++) {
3655 taiko->dai[dai->id - 1].ch_num[i] = rx_slot[i];
3656 taiko->dai[dai->id - 1].ch_act = 0;
3657 taiko->dai[dai->id - 1].ch_tot = rx_num;
3658 }
3659 } else if (dai->id == AIF1_CAP || dai->id == AIF2_CAP ||
3660 dai->id == AIF3_CAP) {
3661 for (i = 0; i < tx_num; i++) {
3662 taiko->dai[dai->id - 1].ch_num[i] = tx_slot[i];
3663 taiko->dai[dai->id - 1].ch_act = 0;
3664 taiko->dai[dai->id - 1].ch_tot = tx_num;
3665 }
3666 }
3667 return 0;
3668}
3669
3670static int taiko_get_channel_map(struct snd_soc_dai *dai,
3671 unsigned int *tx_num, unsigned int *tx_slot,
3672 unsigned int *rx_num, unsigned int *rx_slot)
3673
3674{
3675 struct wcd9xxx *taiko = dev_get_drvdata(dai->codec->control_data);
3676
3677 u32 cnt = 0;
3678 u32 tx_ch[SLIM_MAX_TX_PORTS];
3679 u32 rx_ch[SLIM_MAX_RX_PORTS];
3680
3681 if (!rx_slot && !tx_slot) {
3682 pr_err("%s: Invalid\n", __func__);
3683 return -EINVAL;
3684 }
3685
3686 /* for virtual port, codec driver needs to do
3687 * housekeeping, for now should be ok
3688 */
3689 wcd9xxx_get_channel(taiko, rx_ch, tx_ch);
3690 if (dai->id == AIF1_PB) {
3691 *rx_num = taiko_dai[dai->id - 1].playback.channels_max;
3692 while (cnt < *rx_num) {
3693 rx_slot[cnt] = rx_ch[cnt];
3694 cnt++;
3695 }
3696 } else if (dai->id == AIF1_CAP) {
3697 *tx_num = taiko_dai[dai->id - 1].capture.channels_max;
3698 while (cnt < *tx_num) {
3699 tx_slot[cnt] = tx_ch[6 + cnt];
3700 cnt++;
3701 }
3702 } else if (dai->id == AIF2_PB) {
3703 *rx_num = taiko_dai[dai->id - 1].playback.channels_max;
3704 while (cnt < *rx_num) {
3705 rx_slot[cnt] = rx_ch[5 + cnt];
3706 cnt++;
3707 }
3708 } else if (dai->id == AIF2_CAP) {
3709 *tx_num = taiko_dai[dai->id - 1].capture.channels_max;
3710 tx_slot[0] = tx_ch[cnt];
3711 tx_slot[1] = tx_ch[1 + cnt];
3712 tx_slot[2] = tx_ch[5 + cnt];
3713 tx_slot[3] = tx_ch[3 + cnt];
3714
3715 } else if (dai->id == AIF3_PB) {
3716 *rx_num = taiko_dai[dai->id - 1].playback.channels_max;
3717 rx_slot[0] = rx_ch[3];
3718 rx_slot[1] = rx_ch[4];
3719
3720 } else if (dai->id == AIF3_CAP) {
3721 *tx_num = taiko_dai[dai->id - 1].capture.channels_max;
3722 tx_slot[cnt] = tx_ch[2 + cnt];
3723 tx_slot[cnt + 1] = tx_ch[4 + cnt];
3724 }
3725 pr_debug("%s(): dai_name = %s DAI-ID %x tx_ch %d rx_ch %d\n",
3726 __func__, dai->name, dai->id, *tx_num, *rx_num);
3727
3728
3729 return 0;
3730}
3731
3732static int taiko_hw_params(struct snd_pcm_substream *substream,
3733 struct snd_pcm_hw_params *params,
3734 struct snd_soc_dai *dai)
3735{
3736 struct snd_soc_codec *codec = dai->codec;
3737 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(dai->codec);
3738 u8 path, shift;
3739 u16 tx_fs_reg, rx_fs_reg;
3740 u8 tx_fs_rate, rx_fs_rate, rx_state, tx_state;
3741 u32 compander_fs;
3742
3743 pr_debug("%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__,
3744 dai->name, dai->id, params_rate(params),
3745 params_channels(params));
3746
3747 switch (params_rate(params)) {
3748 case 8000:
3749 tx_fs_rate = 0x00;
3750 rx_fs_rate = 0x00;
3751 compander_fs = COMPANDER_FS_8KHZ;
3752 break;
3753 case 16000:
3754 tx_fs_rate = 0x01;
3755 rx_fs_rate = 0x20;
3756 compander_fs = COMPANDER_FS_16KHZ;
3757 break;
3758 case 32000:
3759 tx_fs_rate = 0x02;
3760 rx_fs_rate = 0x40;
3761 compander_fs = COMPANDER_FS_32KHZ;
3762 break;
3763 case 48000:
3764 tx_fs_rate = 0x03;
3765 rx_fs_rate = 0x60;
3766 compander_fs = COMPANDER_FS_48KHZ;
3767 break;
3768 case 96000:
3769 tx_fs_rate = 0x04;
3770 rx_fs_rate = 0x80;
3771 compander_fs = COMPANDER_FS_96KHZ;
3772 break;
3773 case 192000:
3774 tx_fs_rate = 0x05;
3775 rx_fs_rate = 0xA0;
3776 compander_fs = COMPANDER_FS_192KHZ;
3777 break;
3778 default:
3779 pr_err("%s: Invalid sampling rate %d\n", __func__,
3780 params_rate(params));
3781 return -EINVAL;
3782 }
3783
3784
3785 /**
3786 * If current dai is a tx dai, set sample rate to
3787 * all the txfe paths that are currently not active
3788 */
3789 if ((dai->id == AIF1_CAP) || (dai->id == AIF2_CAP) ||
3790 (dai->id == AIF3_CAP)) {
3791
3792 tx_state = snd_soc_read(codec,
3793 TAIKO_A_CDC_CLK_TX_CLK_EN_B1_CTL);
3794
3795 for (path = 1, shift = 0;
3796 path <= NUM_DECIMATORS; path++, shift++) {
3797
3798 if (path == BITS_PER_REG + 1) {
3799 shift = 0;
3800 tx_state = snd_soc_read(codec,
3801 TAIKO_A_CDC_CLK_TX_CLK_EN_B2_CTL);
3802 }
3803
3804 if (!(tx_state & (1 << shift))) {
3805 tx_fs_reg = TAIKO_A_CDC_TX1_CLK_FS_CTL
3806 + (BITS_PER_REG*(path-1));
3807 snd_soc_update_bits(codec, tx_fs_reg,
3808 0x07, tx_fs_rate);
3809 }
3810 }
3811 if (taiko->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) {
3812 switch (params_format(params)) {
3813 case SNDRV_PCM_FORMAT_S16_LE:
3814 snd_soc_update_bits(codec,
3815 TAIKO_A_CDC_CLK_TX_I2S_CTL,
3816 0x20, 0x20);
3817 break;
3818 case SNDRV_PCM_FORMAT_S32_LE:
3819 snd_soc_update_bits(codec,
3820 TAIKO_A_CDC_CLK_TX_I2S_CTL,
3821 0x20, 0x00);
3822 break;
3823 default:
3824 pr_err("invalid format\n");
3825 break;
3826 }
3827 snd_soc_update_bits(codec, TAIKO_A_CDC_CLK_TX_I2S_CTL,
3828 0x07, tx_fs_rate);
3829 } else {
3830 taiko->dai[dai->id - 1].rate = params_rate(params);
3831 }
3832 }
3833 /**
3834 * TODO: Need to handle case where same RX chain takes 2 or more inputs
3835 * with varying sample rates
3836 */
3837
3838 /**
3839 * If current dai is a rx dai, set sample rate to
3840 * all the rx paths that are currently not active
3841 */
3842 if (dai->id == AIF1_PB || dai->id == AIF2_PB || dai->id == AIF3_PB) {
3843
3844 rx_state = snd_soc_read(codec,
3845 TAIKO_A_CDC_CLK_RX_B1_CTL);
3846
3847 for (path = 1, shift = 0;
3848 path <= NUM_INTERPOLATORS; path++, shift++) {
3849
3850 if (!(rx_state & (1 << shift))) {
3851 rx_fs_reg = TAIKO_A_CDC_RX1_B5_CTL
3852 + (BITS_PER_REG*(path-1));
3853 snd_soc_update_bits(codec, rx_fs_reg,
3854 0xE0, rx_fs_rate);
3855 if (comp_rx_path[shift] < COMPANDER_MAX)
3856 taiko->comp_fs[comp_rx_path[shift]]
3857 = compander_fs;
3858 }
3859 }
3860 if (taiko->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) {
3861 switch (params_format(params)) {
3862 case SNDRV_PCM_FORMAT_S16_LE:
3863 snd_soc_update_bits(codec,
3864 TAIKO_A_CDC_CLK_RX_I2S_CTL,
3865 0x20, 0x20);
3866 break;
3867 case SNDRV_PCM_FORMAT_S32_LE:
3868 snd_soc_update_bits(codec,
3869 TAIKO_A_CDC_CLK_RX_I2S_CTL,
3870 0x20, 0x00);
3871 break;
3872 default:
3873 pr_err("invalid format\n");
3874 break;
3875 }
3876 snd_soc_update_bits(codec, TAIKO_A_CDC_CLK_RX_I2S_CTL,
3877 0x03, (rx_fs_rate >> 0x05));
3878 } else {
3879 taiko->dai[dai->id - 1].rate = params_rate(params);
3880 }
3881 }
3882
3883 return 0;
3884}
3885
3886static struct snd_soc_dai_ops taiko_dai_ops = {
3887 .startup = taiko_startup,
3888 .shutdown = taiko_shutdown,
3889 .hw_params = taiko_hw_params,
3890 .set_sysclk = taiko_set_dai_sysclk,
3891 .set_fmt = taiko_set_dai_fmt,
3892 .set_channel_map = taiko_set_channel_map,
3893 .get_channel_map = taiko_get_channel_map,
3894};
3895
3896static struct snd_soc_dai_driver taiko_dai[] = {
3897 {
3898 .name = "taiko_rx1",
3899 .id = AIF1_PB,
3900 .playback = {
3901 .stream_name = "AIF1 Playback",
3902 .rates = WCD9320_RATES,
3903 .formats = TAIKO_FORMATS,
3904 .rate_max = 192000,
3905 .rate_min = 8000,
3906 .channels_min = 1,
3907 .channels_max = 2,
3908 },
3909 .ops = &taiko_dai_ops,
3910 },
3911 {
3912 .name = "taiko_tx1",
3913 .id = AIF1_CAP,
3914 .capture = {
3915 .stream_name = "AIF1 Capture",
3916 .rates = WCD9320_RATES,
3917 .formats = TAIKO_FORMATS,
3918 .rate_max = 192000,
3919 .rate_min = 8000,
3920 .channels_min = 1,
3921 .channels_max = 4,
3922 },
3923 .ops = &taiko_dai_ops,
3924 },
3925 {
3926 .name = "taiko_rx2",
3927 .id = AIF2_PB,
3928 .playback = {
3929 .stream_name = "AIF2 Playback",
3930 .rates = WCD9320_RATES,
3931 .formats = TAIKO_FORMATS,
3932 .rate_min = 8000,
3933 .rate_max = 192000,
3934 .channels_min = 1,
3935 .channels_max = 2,
3936 },
3937 .ops = &taiko_dai_ops,
3938 },
3939 {
3940 .name = "taiko_tx2",
3941 .id = AIF2_CAP,
3942 .capture = {
3943 .stream_name = "AIF2 Capture",
3944 .rates = WCD9320_RATES,
3945 .formats = TAIKO_FORMATS,
3946 .rate_max = 192000,
3947 .rate_min = 8000,
3948 .channels_min = 1,
3949 .channels_max = 4,
3950 },
3951 .ops = &taiko_dai_ops,
3952 },
3953 {
3954 .name = "taiko_tx3",
3955 .id = AIF3_CAP,
3956 .capture = {
3957 .stream_name = "AIF3 Capture",
3958 .rates = WCD9320_RATES,
3959 .formats = TAIKO_FORMATS,
3960 .rate_max = 48000,
3961 .rate_min = 8000,
3962 .channels_min = 1,
3963 .channels_max = 2,
3964 },
3965 .ops = &taiko_dai_ops,
3966 },
3967 {
3968 .name = "taiko_rx3",
3969 .id = AIF3_PB,
3970 .playback = {
3971 .stream_name = "AIF3 Playback",
3972 .rates = WCD9320_RATES,
3973 .formats = TAIKO_FORMATS,
3974 .rate_min = 8000,
3975 .rate_max = 192000,
3976 .channels_min = 1,
3977 .channels_max = 2,
3978 },
3979 .ops = &taiko_dai_ops,
3980 },
3981};
3982
3983static struct snd_soc_dai_driver taiko_i2s_dai[] = {
3984 {
3985 .name = "taiko_i2s_rx1",
3986 .id = 1,
3987 .playback = {
3988 .stream_name = "AIF1 Playback",
3989 .rates = WCD9320_RATES,
3990 .formats = TAIKO_FORMATS,
3991 .rate_max = 192000,
3992 .rate_min = 8000,
3993 .channels_min = 1,
3994 .channels_max = 4,
3995 },
3996 .ops = &taiko_dai_ops,
3997 },
3998 {
3999 .name = "taiko_i2s_tx1",
4000 .id = 2,
4001 .capture = {
4002 .stream_name = "AIF1 Capture",
4003 .rates = WCD9320_RATES,
4004 .formats = TAIKO_FORMATS,
4005 .rate_max = 192000,
4006 .rate_min = 8000,
4007 .channels_min = 1,
4008 .channels_max = 4,
4009 },
4010 .ops = &taiko_dai_ops,
4011 },
4012};
4013
4014static int taiko_codec_enable_slimrx(struct snd_soc_dapm_widget *w,
4015 struct snd_kcontrol *kcontrol, int event)
4016{
4017 struct wcd9xxx *taiko;
4018 struct snd_soc_codec *codec = w->codec;
4019 struct taiko_priv *taiko_p = snd_soc_codec_get_drvdata(codec);
4020 u32 j = 0;
4021 u32 ret = 0;
4022 codec->control_data = dev_get_drvdata(codec->dev->parent);
4023 taiko = codec->control_data;
4024 /* Execute the callback only if interface type is slimbus */
4025 if (taiko_p->intf_type != WCD9XXX_INTERFACE_TYPE_SLIMBUS)
4026 return 0;
4027
4028 pr_debug("%s: %s %d\n", __func__, w->name, event);
4029
4030 switch (event) {
4031 case SND_SOC_DAPM_POST_PMU:
4032 for (j = 0; j < ARRAY_SIZE(taiko_dai); j++) {
4033 if ((taiko_dai[j].id == AIF1_CAP) ||
4034 (taiko_dai[j].id == AIF2_CAP) ||
4035 (taiko_dai[j].id == AIF3_CAP))
4036 continue;
4037 if (!strncmp(w->sname,
4038 taiko_dai[j].playback.stream_name, 13)) {
4039 ++taiko_p->dai[j].ch_act;
4040 break;
4041 }
4042 }
4043 if (taiko_p->dai[j].ch_act == taiko_p->dai[j].ch_tot)
4044 ret = wcd9xxx_cfg_slim_sch_rx(taiko,
4045 taiko_p->dai[j].ch_num,
4046 taiko_p->dai[j].ch_tot,
4047 taiko_p->dai[j].rate);
4048 break;
4049 case SND_SOC_DAPM_POST_PMD:
4050 for (j = 0; j < ARRAY_SIZE(taiko_dai); j++) {
4051 if ((taiko_dai[j].id == AIF1_CAP) ||
4052 (taiko_dai[j].id == AIF2_CAP) ||
4053 (taiko_dai[j].id == AIF3_CAP))
4054 continue;
4055 if (!strncmp(w->sname,
4056 taiko_dai[j].playback.stream_name, 13)) {
4057 --taiko_p->dai[j].ch_act;
4058 break;
4059 }
4060 }
4061 if (!taiko_p->dai[j].ch_act) {
4062 ret = wcd9xxx_close_slim_sch_rx(taiko,
4063 taiko_p->dai[j].ch_num,
4064 taiko_p->dai[j].ch_tot);
4065 usleep_range(15000, 15000);
4066 taiko_p->dai[j].rate = 0;
4067 memset(taiko_p->dai[j].ch_num, 0, (sizeof(u32)*
4068 taiko_p->dai[j].ch_tot));
4069 taiko_p->dai[j].ch_tot = 0;
4070 }
4071 }
4072 return ret;
4073}
4074
4075static int taiko_codec_enable_slimtx(struct snd_soc_dapm_widget *w,
4076 struct snd_kcontrol *kcontrol, int event)
4077{
4078 struct wcd9xxx *taiko;
4079 struct snd_soc_codec *codec = w->codec;
4080 struct taiko_priv *taiko_p = snd_soc_codec_get_drvdata(codec);
4081 /* index to the DAI ID, for now hardcoding */
4082 u32 j = 0;
4083 u32 ret = 0;
4084
4085 codec->control_data = dev_get_drvdata(codec->dev->parent);
4086 taiko = codec->control_data;
4087
4088 /* Execute the callback only if interface type is slimbus */
4089 if (taiko_p->intf_type != WCD9XXX_INTERFACE_TYPE_SLIMBUS)
4090 return 0;
4091
4092 pr_debug("%s(): %s %d\n", __func__, w->name, event);
4093
4094 switch (event) {
4095 case SND_SOC_DAPM_POST_PMU:
4096 for (j = 0; j < ARRAY_SIZE(taiko_dai); j++) {
4097 if (taiko_dai[j].id == AIF1_PB ||
4098 taiko_dai[j].id == AIF2_PB ||
4099 taiko_dai[j].id == AIF3_PB)
4100 continue;
4101 if (!strncmp(w->sname,
4102 taiko_dai[j].capture.stream_name, 13)) {
4103 ++taiko_p->dai[j].ch_act;
4104 break;
4105 }
4106 }
4107 if (taiko_p->dai[j].ch_act == taiko_p->dai[j].ch_tot)
4108 ret = wcd9xxx_cfg_slim_sch_tx(taiko,
4109 taiko_p->dai[j].ch_num,
4110 taiko_p->dai[j].ch_tot,
4111 taiko_p->dai[j].rate);
4112 break;
4113 case SND_SOC_DAPM_POST_PMD:
4114 for (j = 0; j < ARRAY_SIZE(taiko_dai); j++) {
4115 if (taiko_dai[j].id == AIF1_PB ||
4116 taiko_dai[j].id == AIF2_PB ||
4117 taiko_dai[j].id == AIF3_PB)
4118 continue;
4119 if (!strncmp(w->sname,
4120 taiko_dai[j].capture.stream_name, 13)) {
4121 --taiko_p->dai[j].ch_act;
4122 break;
4123 }
4124 }
4125 if (!taiko_p->dai[j].ch_act) {
4126 ret = wcd9xxx_close_slim_sch_tx(taiko,
4127 taiko_p->dai[j].ch_num,
4128 taiko_p->dai[j].ch_tot);
4129 taiko_p->dai[j].rate = 0;
4130 memset(taiko_p->dai[j].ch_num, 0, (sizeof(u32)*
4131 taiko_p->dai[j].ch_tot));
4132 taiko_p->dai[j].ch_tot = 0;
4133 }
4134 }
4135 return ret;
4136}
4137
4138/* Todo: Have seperate dapm widgets for I2S and Slimbus.
4139 * Might Need to have callbacks registered only for slimbus
4140 */
4141static const struct snd_soc_dapm_widget taiko_dapm_widgets[] = {
4142 /*RX stuff */
4143 SND_SOC_DAPM_OUTPUT("EAR"),
4144
4145 SND_SOC_DAPM_PGA("EAR PA", TAIKO_A_RX_EAR_EN, 4, 0, NULL, 0),
4146
4147 SND_SOC_DAPM_MIXER("DAC1", TAIKO_A_RX_EAR_EN, 6, 0, dac1_switch,
4148 ARRAY_SIZE(dac1_switch)),
4149
4150 SND_SOC_DAPM_AIF_IN_E("SLIM RX1", "AIF1 Playback", 0, SND_SOC_NOPM, 0,
4151 0, taiko_codec_enable_slimrx,
4152 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4153 SND_SOC_DAPM_AIF_IN_E("SLIM RX2", "AIF1 Playback", 0, SND_SOC_NOPM, 0,
4154 0, taiko_codec_enable_slimrx,
4155 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4156 SND_SOC_DAPM_AIF_IN_E("SLIM RX3", "AIF1 Playback", 0, SND_SOC_NOPM, 0,
4157 0, taiko_codec_enable_slimrx,
4158 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4159
4160 SND_SOC_DAPM_AIF_IN_E("SLIM RX4", "AIF3 Playback", 0, SND_SOC_NOPM, 0,
4161 0, taiko_codec_enable_slimrx,
4162 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4163 SND_SOC_DAPM_AIF_IN_E("SLIM RX5", "AIF3 Playback", 0, SND_SOC_NOPM, 0,
4164 0, taiko_codec_enable_slimrx,
4165 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4166
4167 SND_SOC_DAPM_AIF_IN_E("SLIM RX6", "AIF2 Playback", 0, SND_SOC_NOPM, 0,
4168 0, taiko_codec_enable_slimrx,
4169 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4170 SND_SOC_DAPM_AIF_IN_E("SLIM RX7", "AIF2 Playback", 0, SND_SOC_NOPM, 0,
4171 0, taiko_codec_enable_slimrx,
4172 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4173
4174 /* Headphone */
4175 SND_SOC_DAPM_OUTPUT("HEADPHONE"),
4176 SND_SOC_DAPM_PGA_E("HPHL", TAIKO_A_RX_HPH_CNP_EN, 5, 0, NULL, 0,
4177 taiko_hph_pa_event, SND_SOC_DAPM_PRE_PMU |
4178 SND_SOC_DAPM_POST_PMD),
4179 SND_SOC_DAPM_MIXER("HPHL DAC", TAIKO_A_RX_HPH_L_DAC_CTL, 7, 0,
4180 hphl_switch, ARRAY_SIZE(hphl_switch)),
4181
4182 SND_SOC_DAPM_PGA_E("HPHR", TAIKO_A_RX_HPH_CNP_EN, 4, 0, NULL, 0,
4183 taiko_hph_pa_event, SND_SOC_DAPM_PRE_PMU |
4184 SND_SOC_DAPM_POST_PMD),
4185
4186 SND_SOC_DAPM_DAC_E("HPHR DAC", NULL, TAIKO_A_RX_HPH_R_DAC_CTL, 7, 0,
4187 taiko_hphr_dac_event,
4188 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
4189
4190 /* Speaker */
4191 SND_SOC_DAPM_OUTPUT("LINEOUT1"),
4192 SND_SOC_DAPM_OUTPUT("LINEOUT2"),
4193 SND_SOC_DAPM_OUTPUT("LINEOUT3"),
4194 SND_SOC_DAPM_OUTPUT("LINEOUT4"),
4195
4196 SND_SOC_DAPM_PGA_E("LINEOUT1 PA", TAIKO_A_RX_LINE_CNP_EN, 0, 0, NULL,
4197 0, taiko_codec_enable_lineout, SND_SOC_DAPM_PRE_PMU |
4198 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4199 SND_SOC_DAPM_PGA_E("LINEOUT2 PA", TAIKO_A_RX_LINE_CNP_EN, 1, 0, NULL,
4200 0, taiko_codec_enable_lineout, SND_SOC_DAPM_PRE_PMU |
4201 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4202 SND_SOC_DAPM_PGA_E("LINEOUT3 PA", TAIKO_A_RX_LINE_CNP_EN, 2, 0, NULL,
4203 0, taiko_codec_enable_lineout, SND_SOC_DAPM_PRE_PMU |
4204 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4205 SND_SOC_DAPM_PGA_E("LINEOUT4 PA", TAIKO_A_RX_LINE_CNP_EN, 3, 0, NULL,
4206 0, taiko_codec_enable_lineout, SND_SOC_DAPM_PRE_PMU |
4207 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4208
4209 SND_SOC_DAPM_DAC_E("LINEOUT1 DAC", NULL, TAIKO_A_RX_LINE_1_DAC_CTL, 7, 0
4210 , taiko_lineout_dac_event,
4211 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
4212 SND_SOC_DAPM_DAC_E("LINEOUT2 DAC", NULL, TAIKO_A_RX_LINE_2_DAC_CTL, 7, 0
4213 , taiko_lineout_dac_event,
4214 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
4215 SND_SOC_DAPM_DAC_E("LINEOUT3 DAC", NULL, TAIKO_A_RX_LINE_3_DAC_CTL, 7, 0
4216 , taiko_lineout_dac_event,
4217 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
4218 SND_SOC_DAPM_SWITCH("LINEOUT3 DAC GROUND", SND_SOC_NOPM, 0, 0,
4219 &lineout3_ground_switch),
4220 SND_SOC_DAPM_DAC_E("LINEOUT4 DAC", NULL, TAIKO_A_RX_LINE_4_DAC_CTL, 7, 0
4221 , taiko_lineout_dac_event,
4222 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
4223 SND_SOC_DAPM_SWITCH("LINEOUT4 DAC GROUND", SND_SOC_NOPM, 0, 0,
4224 &lineout4_ground_switch),
4225
4226 SND_SOC_DAPM_MIXER_E("RX1 MIX2", TAIKO_A_CDC_CLK_RX_B1_CTL, 0, 0, NULL,
4227 0, taiko_codec_reset_interpolator, SND_SOC_DAPM_PRE_PMU |
4228 SND_SOC_DAPM_POST_PMU),
4229 SND_SOC_DAPM_MIXER_E("RX2 MIX2", TAIKO_A_CDC_CLK_RX_B1_CTL, 1, 0, NULL,
4230 0, taiko_codec_reset_interpolator, SND_SOC_DAPM_PRE_PMU |
4231 SND_SOC_DAPM_POST_PMU),
4232 SND_SOC_DAPM_MIXER_E("RX7 MIX2", TAIKO_A_CDC_CLK_RX_B1_CTL, 2, 0, NULL,
4233 0, taiko_codec_reset_interpolator, SND_SOC_DAPM_PRE_PMU |
4234 SND_SOC_DAPM_POST_PMU),
4235 SND_SOC_DAPM_MIXER_E("RX4 MIX1", TAIKO_A_CDC_CLK_RX_B1_CTL, 3, 0, NULL,
4236 0, taiko_codec_reset_interpolator, SND_SOC_DAPM_PRE_PMU |
4237 SND_SOC_DAPM_POST_PMU),
4238 SND_SOC_DAPM_MIXER_E("RX5 MIX1", TAIKO_A_CDC_CLK_RX_B1_CTL, 4, 0, NULL,
4239 0, taiko_codec_reset_interpolator, SND_SOC_DAPM_PRE_PMU |
4240 SND_SOC_DAPM_POST_PMU),
4241 SND_SOC_DAPM_MIXER_E("RX6 MIX1", TAIKO_A_CDC_CLK_RX_B1_CTL, 5, 0, NULL,
4242 0, taiko_codec_reset_interpolator, SND_SOC_DAPM_PRE_PMU |
4243 SND_SOC_DAPM_POST_PMU),
4244 SND_SOC_DAPM_MIXER_E("RX7 MIX1", TAIKO_A_CDC_CLK_RX_B1_CTL, 6, 0, NULL,
4245 0, taiko_codec_reset_interpolator, SND_SOC_DAPM_PRE_PMU |
4246 SND_SOC_DAPM_POST_PMU),
4247
4248 SND_SOC_DAPM_MIXER("RX1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
4249 SND_SOC_DAPM_MIXER("RX2 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
4250 SND_SOC_DAPM_MIXER("RX3 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
4251
4252 SND_SOC_DAPM_MUX_E("RX4 DSM MUX", TAIKO_A_CDC_CLK_RX_B1_CTL, 3, 0,
4253 &rx4_dsm_mux, taiko_codec_reset_interpolator,
4254 SND_SOC_DAPM_PRE_PMU),
4255
4256 SND_SOC_DAPM_MUX_E("RX6 DSM MUX", TAIKO_A_CDC_CLK_RX_B1_CTL, 5, 0,
4257 &rx6_dsm_mux, taiko_codec_reset_interpolator,
4258 SND_SOC_DAPM_PRE_PMU),
4259
4260 SND_SOC_DAPM_MIXER("RX1 CHAIN", TAIKO_A_CDC_RX1_B6_CTL, 5, 0, NULL, 0),
4261 SND_SOC_DAPM_MIXER("RX2 CHAIN", TAIKO_A_CDC_RX2_B6_CTL, 5, 0, NULL, 0),
4262
4263 SND_SOC_DAPM_MUX("RX1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
4264 &rx_mix1_inp1_mux),
4265 SND_SOC_DAPM_MUX("RX1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
4266 &rx_mix1_inp2_mux),
4267 SND_SOC_DAPM_MUX("RX1 MIX1 INP3", SND_SOC_NOPM, 0, 0,
4268 &rx_mix1_inp3_mux),
4269 SND_SOC_DAPM_MUX("RX2 MIX1 INP1", SND_SOC_NOPM, 0, 0,
4270 &rx2_mix1_inp1_mux),
4271 SND_SOC_DAPM_MUX("RX2 MIX1 INP2", SND_SOC_NOPM, 0, 0,
4272 &rx2_mix1_inp2_mux),
4273 SND_SOC_DAPM_MUX("RX3 MIX1 INP1", SND_SOC_NOPM, 0, 0,
4274 &rx3_mix1_inp1_mux),
4275 SND_SOC_DAPM_MUX("RX3 MIX1 INP2", SND_SOC_NOPM, 0, 0,
4276 &rx3_mix1_inp2_mux),
4277 SND_SOC_DAPM_MUX("RX4 MIX1 INP1", SND_SOC_NOPM, 0, 0,
4278 &rx4_mix1_inp1_mux),
4279 SND_SOC_DAPM_MUX("RX4 MIX1 INP2", SND_SOC_NOPM, 0, 0,
4280 &rx4_mix1_inp2_mux),
4281 SND_SOC_DAPM_MUX("RX5 MIX1 INP1", SND_SOC_NOPM, 0, 0,
4282 &rx5_mix1_inp1_mux),
4283 SND_SOC_DAPM_MUX("RX5 MIX1 INP2", SND_SOC_NOPM, 0, 0,
4284 &rx5_mix1_inp2_mux),
4285 SND_SOC_DAPM_MUX("RX6 MIX1 INP1", SND_SOC_NOPM, 0, 0,
4286 &rx6_mix1_inp1_mux),
4287 SND_SOC_DAPM_MUX("RX6 MIX1 INP2", SND_SOC_NOPM, 0, 0,
4288 &rx6_mix1_inp2_mux),
4289 SND_SOC_DAPM_MUX("RX7 MIX1 INP1", SND_SOC_NOPM, 0, 0,
4290 &rx7_mix1_inp1_mux),
4291 SND_SOC_DAPM_MUX("RX7 MIX1 INP2", SND_SOC_NOPM, 0, 0,
4292 &rx7_mix1_inp2_mux),
4293 SND_SOC_DAPM_MUX("RX1 MIX2 INP1", SND_SOC_NOPM, 0, 0,
4294 &rx1_mix2_inp1_mux),
4295 SND_SOC_DAPM_MUX("RX1 MIX2 INP2", SND_SOC_NOPM, 0, 0,
4296 &rx1_mix2_inp2_mux),
4297 SND_SOC_DAPM_MUX("RX2 MIX2 INP1", SND_SOC_NOPM, 0, 0,
4298 &rx2_mix2_inp1_mux),
4299 SND_SOC_DAPM_MUX("RX2 MIX2 INP2", SND_SOC_NOPM, 0, 0,
4300 &rx2_mix2_inp2_mux),
4301 SND_SOC_DAPM_MUX("RX7 MIX2 INP1", SND_SOC_NOPM, 0, 0,
4302 &rx7_mix2_inp1_mux),
4303 SND_SOC_DAPM_MUX("RX7 MIX2 INP2", SND_SOC_NOPM, 0, 0,
4304 &rx7_mix2_inp2_mux),
4305
4306 SND_SOC_DAPM_SUPPLY("CP", TAIKO_A_NCP_EN, 0, 0,
4307 taiko_codec_enable_charge_pump, SND_SOC_DAPM_POST_PMU |
4308 SND_SOC_DAPM_PRE_PMD),
4309
4310 SND_SOC_DAPM_SUPPLY("RX_BIAS", SND_SOC_NOPM, 0, 0,
4311 taiko_codec_enable_rx_bias, SND_SOC_DAPM_PRE_PMU |
4312 SND_SOC_DAPM_POST_PMD),
4313
4314 /* TX */
4315
4316 SND_SOC_DAPM_SUPPLY("CDC_CONN", TAIKO_A_CDC_CLK_OTHR_CTL, 2, 0, NULL,
4317 0),
4318
4319 SND_SOC_DAPM_SUPPLY("LDO_H", TAIKO_A_LDO_H_MODE_1, 7, 0,
4320 taiko_codec_enable_ldo_h, SND_SOC_DAPM_POST_PMU),
4321
4322 SND_SOC_DAPM_SUPPLY("COMP1_CLK", SND_SOC_NOPM, 0, 0,
4323 taiko_config_compander, SND_SOC_DAPM_PRE_PMU |
4324 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_POST_PMD),
4325 SND_SOC_DAPM_SUPPLY("COMP2_CLK", SND_SOC_NOPM, 1, 0,
4326 taiko_config_compander, SND_SOC_DAPM_PRE_PMU |
4327 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_POST_PMD),
4328
4329
4330 SND_SOC_DAPM_INPUT("AMIC1"),
4331 SND_SOC_DAPM_MICBIAS_E("MIC BIAS1 External", TAIKO_A_MICB_1_CTL, 7, 0,
4332 taiko_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
4333 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4334 SND_SOC_DAPM_MICBIAS_E("MIC BIAS1 Internal1", TAIKO_A_MICB_1_CTL, 7, 0,
4335 taiko_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
4336 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4337 SND_SOC_DAPM_MICBIAS_E("MIC BIAS1 Internal2", TAIKO_A_MICB_1_CTL, 7, 0,
4338 taiko_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
4339 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4340 SND_SOC_DAPM_ADC_E("ADC1", NULL, TAIKO_A_TX_1_2_EN, 7, 0,
4341 taiko_codec_enable_adc, SND_SOC_DAPM_PRE_PMU |
4342 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4343
4344 SND_SOC_DAPM_INPUT("AMIC3"),
4345 SND_SOC_DAPM_ADC_E("ADC3", NULL, TAIKO_A_TX_3_4_EN, 7, 0,
4346 taiko_codec_enable_adc, SND_SOC_DAPM_PRE_PMU |
4347 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4348
4349 SND_SOC_DAPM_INPUT("AMIC4"),
4350 SND_SOC_DAPM_ADC_E("ADC4", NULL, TAIKO_A_TX_3_4_EN, 3, 0,
4351 taiko_codec_enable_adc, SND_SOC_DAPM_PRE_PMU |
4352 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4353
4354 SND_SOC_DAPM_INPUT("AMIC5"),
4355 SND_SOC_DAPM_ADC_E("ADC5", NULL, TAIKO_A_TX_5_6_EN, 7, 0,
4356 taiko_codec_enable_adc, SND_SOC_DAPM_POST_PMU),
4357
4358 SND_SOC_DAPM_INPUT("AMIC6"),
4359 SND_SOC_DAPM_ADC_E("ADC6", NULL, TAIKO_A_TX_5_6_EN, 3, 0,
4360 taiko_codec_enable_adc, SND_SOC_DAPM_POST_PMU),
4361
4362 SND_SOC_DAPM_MUX_E("DEC1 MUX", TAIKO_A_CDC_CLK_TX_CLK_EN_B1_CTL, 0, 0,
4363 &dec1_mux, taiko_codec_enable_dec,
4364 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
4365 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
4366
4367 SND_SOC_DAPM_MUX_E("DEC2 MUX", TAIKO_A_CDC_CLK_TX_CLK_EN_B1_CTL, 1, 0,
4368 &dec2_mux, taiko_codec_enable_dec,
4369 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
4370 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
4371
4372 SND_SOC_DAPM_MUX_E("DEC3 MUX", TAIKO_A_CDC_CLK_TX_CLK_EN_B1_CTL, 2, 0,
4373 &dec3_mux, taiko_codec_enable_dec,
4374 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
4375 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
4376
4377 SND_SOC_DAPM_MUX_E("DEC4 MUX", TAIKO_A_CDC_CLK_TX_CLK_EN_B1_CTL, 3, 0,
4378 &dec4_mux, taiko_codec_enable_dec,
4379 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
4380 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
4381
4382 SND_SOC_DAPM_MUX_E("DEC5 MUX", TAIKO_A_CDC_CLK_TX_CLK_EN_B1_CTL, 4, 0,
4383 &dec5_mux, taiko_codec_enable_dec,
4384 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
4385 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
4386
4387 SND_SOC_DAPM_MUX_E("DEC6 MUX", TAIKO_A_CDC_CLK_TX_CLK_EN_B1_CTL, 5, 0,
4388 &dec6_mux, taiko_codec_enable_dec,
4389 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
4390 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
4391
4392 SND_SOC_DAPM_MUX_E("DEC7 MUX", TAIKO_A_CDC_CLK_TX_CLK_EN_B1_CTL, 6, 0,
4393 &dec7_mux, taiko_codec_enable_dec,
4394 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
4395 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
4396
4397 SND_SOC_DAPM_MUX_E("DEC8 MUX", TAIKO_A_CDC_CLK_TX_CLK_EN_B1_CTL, 7, 0,
4398 &dec8_mux, taiko_codec_enable_dec,
4399 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
4400 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
4401
4402 SND_SOC_DAPM_MUX_E("DEC9 MUX", TAIKO_A_CDC_CLK_TX_CLK_EN_B2_CTL, 0, 0,
4403 &dec9_mux, taiko_codec_enable_dec,
4404 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
4405 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
4406
4407 SND_SOC_DAPM_MUX_E("DEC10 MUX", TAIKO_A_CDC_CLK_TX_CLK_EN_B2_CTL, 1, 0,
4408 &dec10_mux, taiko_codec_enable_dec,
4409 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
4410 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
4411
4412 SND_SOC_DAPM_MUX("ANC1 MUX", SND_SOC_NOPM, 0, 0, &anc1_mux),
4413 SND_SOC_DAPM_MUX("ANC2 MUX", SND_SOC_NOPM, 0, 0, &anc2_mux),
4414
4415 SND_SOC_DAPM_MIXER_E("ANC", SND_SOC_NOPM, 0, 0, NULL, 0,
4416 taiko_codec_enable_anc, SND_SOC_DAPM_PRE_PMU |
4417 SND_SOC_DAPM_POST_PMD),
4418
4419 SND_SOC_DAPM_MUX("ANC1 FB MUX", SND_SOC_NOPM, 0, 0, &anc1_fb_mux),
4420
4421 SND_SOC_DAPM_INPUT("AMIC2"),
4422 SND_SOC_DAPM_MICBIAS_E("MIC BIAS2 External", TAIKO_A_MICB_2_CTL, 7, 0,
4423 taiko_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
4424 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4425 SND_SOC_DAPM_MICBIAS_E("MIC BIAS2 Internal1", TAIKO_A_MICB_2_CTL, 7, 0,
4426 taiko_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
4427 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4428 SND_SOC_DAPM_MICBIAS_E("MIC BIAS2 Internal2", TAIKO_A_MICB_2_CTL, 7, 0,
4429 taiko_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
4430 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4431 SND_SOC_DAPM_MICBIAS_E("MIC BIAS2 Internal3", TAIKO_A_MICB_2_CTL, 7, 0,
4432 taiko_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
4433 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4434 SND_SOC_DAPM_MICBIAS_E("MIC BIAS3 External", TAIKO_A_MICB_3_CTL, 7, 0,
4435 taiko_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
4436 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4437 SND_SOC_DAPM_MICBIAS_E("MIC BIAS3 Internal1", TAIKO_A_MICB_3_CTL, 7, 0,
4438 taiko_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
4439 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4440 SND_SOC_DAPM_MICBIAS_E("MIC BIAS3 Internal2", TAIKO_A_MICB_3_CTL, 7, 0,
4441 taiko_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
4442 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4443 SND_SOC_DAPM_MICBIAS_E("MIC BIAS4 External", TAIKO_A_MICB_4_CTL, 7,
4444 0, taiko_codec_enable_micbias,
4445 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
4446 SND_SOC_DAPM_POST_PMD),
4447
4448 SND_SOC_DAPM_ADC_E("ADC2", NULL, TAIKO_A_TX_1_2_EN, 3, 0,
4449 taiko_codec_enable_adc, SND_SOC_DAPM_PRE_PMU |
4450 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4451
4452 SND_SOC_DAPM_MUX("SLIM TX1 MUX", SND_SOC_NOPM, 0, 0, &sb_tx1_mux),
4453 SND_SOC_DAPM_AIF_OUT_E("SLIM TX1", "AIF2 Capture", 0, SND_SOC_NOPM, 0,
4454 0, taiko_codec_enable_slimtx,
4455 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4456
4457 SND_SOC_DAPM_MUX("SLIM TX2 MUX", SND_SOC_NOPM, 0, 0, &sb_tx2_mux),
4458 SND_SOC_DAPM_AIF_OUT_E("SLIM TX2", "AIF2 Capture", 0, SND_SOC_NOPM, 0,
4459 0, taiko_codec_enable_slimtx,
4460 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4461
4462 SND_SOC_DAPM_MUX("SLIM TX3 MUX", SND_SOC_NOPM, 0, 0, &sb_tx3_mux),
4463 SND_SOC_DAPM_AIF_OUT_E("SLIM TX3", "AIF3 Capture", 0, SND_SOC_NOPM, 0,
4464 0, taiko_codec_enable_slimtx,
4465 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4466
4467 SND_SOC_DAPM_MUX("SLIM TX4 MUX", SND_SOC_NOPM, 0, 0, &sb_tx4_mux),
4468 SND_SOC_DAPM_AIF_OUT_E("SLIM TX4", "AIF2 Capture", 0, SND_SOC_NOPM, 0,
4469 0, taiko_codec_enable_slimtx,
4470 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4471
4472 SND_SOC_DAPM_MUX("SLIM TX5 MUX", SND_SOC_NOPM, 0, 0, &sb_tx5_mux),
4473 SND_SOC_DAPM_AIF_OUT_E("SLIM TX5", "AIF3 Capture", 0, SND_SOC_NOPM, 0,
4474 0, taiko_codec_enable_slimtx,
4475 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4476
4477 SND_SOC_DAPM_MUX("SLIM TX6 MUX", SND_SOC_NOPM, 0, 0, &sb_tx6_mux),
4478 SND_SOC_DAPM_AIF_OUT_E("SLIM TX6", "AIF2 Capture", 0, SND_SOC_NOPM, 0,
4479 0, taiko_codec_enable_slimtx,
4480 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4481
4482 SND_SOC_DAPM_MUX("SLIM TX7 MUX", SND_SOC_NOPM, 0, 0, &sb_tx7_mux),
4483 SND_SOC_DAPM_AIF_OUT_E("SLIM TX7", "AIF1 Capture", 0, SND_SOC_NOPM, 0,
4484 0, taiko_codec_enable_slimtx,
4485 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4486
4487 SND_SOC_DAPM_MUX("SLIM TX8 MUX", SND_SOC_NOPM, 0, 0, &sb_tx8_mux),
4488 SND_SOC_DAPM_AIF_OUT_E("SLIM TX8", "AIF1 Capture", 0, SND_SOC_NOPM, 0,
4489 0, taiko_codec_enable_slimtx,
4490 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4491
4492 SND_SOC_DAPM_MUX("SLIM TX9 MUX", SND_SOC_NOPM, 0, 0, &sb_tx9_mux),
4493 SND_SOC_DAPM_AIF_OUT_E("SLIM TX9", "AIF1 Capture", NULL, SND_SOC_NOPM,
4494 0, 0, taiko_codec_enable_slimtx,
4495 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4496
4497 SND_SOC_DAPM_MUX("SLIM TX10 MUX", SND_SOC_NOPM, 0, 0, &sb_tx10_mux),
4498 SND_SOC_DAPM_AIF_OUT_E("SLIM TX10", "AIF1 Capture", NULL, SND_SOC_NOPM,
4499 0, 0, taiko_codec_enable_slimtx,
4500 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
4501
4502 /* Digital Mic Inputs */
4503 SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0,
4504 taiko_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
4505 SND_SOC_DAPM_POST_PMD),
4506
4507 SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 0, 0,
4508 taiko_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
4509 SND_SOC_DAPM_POST_PMD),
4510
4511 SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 0, 0,
4512 taiko_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
4513 SND_SOC_DAPM_POST_PMD),
4514
4515 SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 0, 0,
4516 taiko_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
4517 SND_SOC_DAPM_POST_PMD),
4518
4519 SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 0, 0,
4520 taiko_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
4521 SND_SOC_DAPM_POST_PMD),
4522 SND_SOC_DAPM_ADC_E("DMIC6", NULL, SND_SOC_NOPM, 0, 0,
4523 taiko_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
4524 SND_SOC_DAPM_POST_PMD),
4525
4526 /* Sidetone */
4527 SND_SOC_DAPM_MUX("IIR1 INP1 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp1_mux),
4528 SND_SOC_DAPM_PGA("IIR1", TAIKO_A_CDC_CLK_SD_CTL, 0, 0, NULL, 0),
4529
4530 /* AUX PGA */
4531 SND_SOC_DAPM_ADC_E("AUX_PGA_Left", NULL, TAIKO_A_RX_AUX_SW_CTL, 7, 0,
4532 taiko_codec_enable_aux_pga, SND_SOC_DAPM_PRE_PMU |
4533 SND_SOC_DAPM_POST_PMD),
4534
4535 SND_SOC_DAPM_ADC_E("AUX_PGA_Right", NULL, TAIKO_A_RX_AUX_SW_CTL, 6, 0,
4536 taiko_codec_enable_aux_pga, SND_SOC_DAPM_PRE_PMU |
4537 SND_SOC_DAPM_POST_PMD),
4538
4539 /* Lineout, ear and HPH PA Mixers */
4540
4541 SND_SOC_DAPM_MIXER("EAR_PA_MIXER", SND_SOC_NOPM, 0, 0,
4542 ear_pa_mix, ARRAY_SIZE(ear_pa_mix)),
4543
4544 SND_SOC_DAPM_MIXER("HPHL_PA_MIXER", SND_SOC_NOPM, 0, 0,
4545 hphl_pa_mix, ARRAY_SIZE(hphl_pa_mix)),
4546
4547 SND_SOC_DAPM_MIXER("HPHR_PA_MIXER", SND_SOC_NOPM, 0, 0,
4548 hphr_pa_mix, ARRAY_SIZE(hphr_pa_mix)),
4549
4550 SND_SOC_DAPM_MIXER("LINEOUT1_PA_MIXER", SND_SOC_NOPM, 0, 0,
4551 lineout1_pa_mix, ARRAY_SIZE(lineout1_pa_mix)),
4552
4553 SND_SOC_DAPM_MIXER("LINEOUT2_PA_MIXER", SND_SOC_NOPM, 0, 0,
4554 lineout2_pa_mix, ARRAY_SIZE(lineout2_pa_mix)),
4555
4556 SND_SOC_DAPM_MIXER("LINEOUT3_PA_MIXER", SND_SOC_NOPM, 0, 0,
4557 lineout3_pa_mix, ARRAY_SIZE(lineout3_pa_mix)),
4558
4559 SND_SOC_DAPM_MIXER("LINEOUT4_PA_MIXER", SND_SOC_NOPM, 0, 0,
4560 lineout4_pa_mix, ARRAY_SIZE(lineout4_pa_mix)),
4561
4562};
4563
4564static short taiko_codec_read_sta_result(struct snd_soc_codec *codec)
4565{
4566 u8 bias_msb, bias_lsb;
4567 short bias_value;
4568
4569 bias_msb = snd_soc_read(codec, TAIKO_A_CDC_MBHC_B3_STATUS);
4570 bias_lsb = snd_soc_read(codec, TAIKO_A_CDC_MBHC_B2_STATUS);
4571 bias_value = (bias_msb << 8) | bias_lsb;
4572 return bias_value;
4573}
4574
4575static short taiko_codec_read_dce_result(struct snd_soc_codec *codec)
4576{
4577 u8 bias_msb, bias_lsb;
4578 short bias_value;
4579
4580 bias_msb = snd_soc_read(codec, TAIKO_A_CDC_MBHC_B5_STATUS);
4581 bias_lsb = snd_soc_read(codec, TAIKO_A_CDC_MBHC_B4_STATUS);
4582 bias_value = (bias_msb << 8) | bias_lsb;
4583 return bias_value;
4584}
4585
4586static void taiko_turn_onoff_rel_detection(struct snd_soc_codec *codec, bool on)
4587{
4588 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_B1_CTL, 0x02, on << 1);
4589}
4590
4591static short __taiko_codec_sta_dce(struct snd_soc_codec *codec, int dce,
4592 bool override_bypass, bool noreldetection)
4593{
4594 short bias_value;
4595 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
4596
4597 wcd9xxx_disable_irq(codec->control_data, TAIKO_IRQ_MBHC_POTENTIAL);
4598 if (noreldetection)
4599 taiko_turn_onoff_rel_detection(codec, false);
4600
4601 /* Turn on the override */
4602 if (!override_bypass)
4603 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_B1_CTL, 0x4, 0x4);
4604 if (dce) {
4605 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x8, 0x8);
4606 snd_soc_write(codec, TAIKO_A_CDC_MBHC_EN_CTL, 0x4);
4607 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x8, 0x0);
4608 usleep_range(taiko->mbhc_data.t_sta_dce,
4609 taiko->mbhc_data.t_sta_dce);
4610 snd_soc_write(codec, TAIKO_A_CDC_MBHC_EN_CTL, 0x4);
4611 usleep_range(taiko->mbhc_data.t_dce,
4612 taiko->mbhc_data.t_dce);
4613 bias_value = taiko_codec_read_dce_result(codec);
4614 } else {
4615 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x8, 0x8);
4616 snd_soc_write(codec, TAIKO_A_CDC_MBHC_EN_CTL, 0x2);
4617 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x8, 0x0);
4618 usleep_range(taiko->mbhc_data.t_sta_dce,
4619 taiko->mbhc_data.t_sta_dce);
4620 snd_soc_write(codec, TAIKO_A_CDC_MBHC_EN_CTL, 0x2);
4621 usleep_range(taiko->mbhc_data.t_sta,
4622 taiko->mbhc_data.t_sta);
4623 bias_value = taiko_codec_read_sta_result(codec);
4624 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x8, 0x8);
4625 snd_soc_write(codec, TAIKO_A_CDC_MBHC_EN_CTL, 0x0);
4626 }
4627 /* Turn off the override after measuring mic voltage */
4628 if (!override_bypass)
4629 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_B1_CTL, 0x04, 0x00);
4630
4631 if (noreldetection)
4632 taiko_turn_onoff_rel_detection(codec, true);
4633 wcd9xxx_enable_irq(codec->control_data, TAIKO_IRQ_MBHC_POTENTIAL);
4634
4635 return bias_value;
4636}
4637
4638static short taiko_codec_sta_dce(struct snd_soc_codec *codec, int dce,
4639 bool norel)
4640{
4641 return __taiko_codec_sta_dce(codec, dce, false, norel);
4642}
4643
4644/* called only from interrupt which is under codec_resource_lock acquisition */
4645static short taiko_codec_setup_hs_polling(struct snd_soc_codec *codec)
4646{
4647 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
4648 short bias_value;
4649 u8 cfilt_mode;
4650
4651 pr_debug("%s: enter, mclk_enabled %d\n", __func__, taiko->mclk_enabled);
4652 if (!taiko->mbhc_cfg.calibration) {
4653 pr_err("Error, no taiko calibration\n");
4654 return -ENODEV;
4655 }
4656
4657 if (!taiko->mclk_enabled) {
4658 taiko_codec_disable_clock_block(codec);
4659 taiko_codec_enable_bandgap(codec, TAIKO_BANDGAP_MBHC_MODE);
4660 taiko_enable_rx_bias(codec, 1);
4661 taiko_codec_enable_clock_block(codec, 1);
4662 }
4663
4664 snd_soc_update_bits(codec, TAIKO_A_CLK_BUFF_EN1, 0x05, 0x01);
4665
4666 /* Make sure CFILT is in fast mode, save current mode */
4667 cfilt_mode = snd_soc_read(codec, taiko->mbhc_bias_regs.cfilt_ctl);
4668 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.cfilt_ctl, 0x70, 0x00);
4669
4670 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.ctl_reg, 0x1F, 0x16);
4671
4672 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x2, 0x2);
4673 snd_soc_write(codec, TAIKO_A_MBHC_SCALING_MUX_1, 0x84);
4674
4675 snd_soc_update_bits(codec, TAIKO_A_TX_7_MBHC_EN, 0x80, 0x80);
4676 snd_soc_update_bits(codec, TAIKO_A_TX_7_MBHC_EN, 0x1F, 0x1C);
4677 snd_soc_update_bits(codec, TAIKO_A_TX_7_MBHC_TEST_CTL, 0x40, 0x40);
4678
4679 snd_soc_update_bits(codec, TAIKO_A_TX_7_MBHC_EN, 0x80, 0x00);
4680 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x8, 0x8);
4681 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x8, 0x00);
4682
4683 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_B1_CTL, 0x2, 0x2);
4684 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x8, 0x8);
4685
4686 taiko_codec_calibrate_hs_polling(codec);
4687
4688 /* don't flip override */
4689 bias_value = __taiko_codec_sta_dce(codec, 1, true, true);
4690 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.cfilt_ctl, 0x40,
4691 cfilt_mode);
4692 snd_soc_update_bits(codec, TAIKO_A_MBHC_HPH, 0x13, 0x00);
4693
4694 return bias_value;
4695}
4696
4697static int taiko_cancel_btn_work(struct taiko_priv *taiko)
4698{
4699 int r = 0;
4700 struct wcd9xxx *core = dev_get_drvdata(taiko->codec->dev->parent);
4701
4702 if (cancel_delayed_work_sync(&taiko->mbhc_btn_dwork)) {
4703 /* if scheduled mbhc_btn_dwork is canceled from here,
4704 * we have to unlock from here instead btn_work */
4705 wcd9xxx_unlock_sleep(core);
4706 r = 1;
4707 }
4708 return r;
4709}
4710
4711/* called under codec_resource_lock acquisition */
4712void taiko_set_and_turnoff_hph_padac(struct snd_soc_codec *codec)
4713{
4714 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
4715 u8 wg_time;
4716
4717 wg_time = snd_soc_read(codec, TAIKO_A_RX_HPH_CNP_WG_TIME) ;
4718 wg_time += 1;
4719
4720 /* If headphone PA is on, check if userspace receives
4721 * removal event to sync-up PA's state */
4722 if (taiko_is_hph_pa_on(codec)) {
4723 pr_debug("%s PA is on, setting PA_OFF_ACK\n", __func__);
4724 set_bit(TAIKO_HPHL_PA_OFF_ACK, &taiko->hph_pa_dac_state);
4725 set_bit(TAIKO_HPHR_PA_OFF_ACK, &taiko->hph_pa_dac_state);
4726 } else {
4727 pr_debug("%s PA is off\n", __func__);
4728 }
4729
4730 if (taiko_is_hph_dac_on(codec, 1))
4731 set_bit(TAIKO_HPHL_DAC_OFF_ACK, &taiko->hph_pa_dac_state);
4732 if (taiko_is_hph_dac_on(codec, 0))
4733 set_bit(TAIKO_HPHR_DAC_OFF_ACK, &taiko->hph_pa_dac_state);
4734
4735 snd_soc_update_bits(codec, TAIKO_A_RX_HPH_CNP_EN, 0x30, 0x00);
4736 snd_soc_update_bits(codec, TAIKO_A_RX_HPH_L_DAC_CTL,
4737 0xC0, 0x00);
4738 snd_soc_update_bits(codec, TAIKO_A_RX_HPH_R_DAC_CTL,
4739 0xC0, 0x00);
4740 usleep_range(wg_time * 1000, wg_time * 1000);
4741}
4742
4743static void taiko_clr_and_turnon_hph_padac(struct taiko_priv *taiko)
4744{
4745 bool pa_turned_on = false;
4746 struct snd_soc_codec *codec = taiko->codec;
4747 u8 wg_time;
4748
4749 wg_time = snd_soc_read(codec, TAIKO_A_RX_HPH_CNP_WG_TIME) ;
4750 wg_time += 1;
4751
4752 if (test_and_clear_bit(TAIKO_HPHR_DAC_OFF_ACK,
4753 &taiko->hph_pa_dac_state)) {
4754 pr_debug("%s: HPHR clear flag and enable DAC\n", __func__);
4755 snd_soc_update_bits(taiko->codec, TAIKO_A_RX_HPH_R_DAC_CTL,
4756 0xC0, 0xC0);
4757 }
4758 if (test_and_clear_bit(TAIKO_HPHL_DAC_OFF_ACK,
4759 &taiko->hph_pa_dac_state)) {
4760 pr_debug("%s: HPHL clear flag and enable DAC\n", __func__);
4761 snd_soc_update_bits(taiko->codec, TAIKO_A_RX_HPH_L_DAC_CTL,
4762 0xC0, 0xC0);
4763 }
4764
4765 if (test_and_clear_bit(TAIKO_HPHR_PA_OFF_ACK,
4766 &taiko->hph_pa_dac_state)) {
4767 pr_debug("%s: HPHR clear flag and enable PA\n", __func__);
4768 snd_soc_update_bits(taiko->codec, TAIKO_A_RX_HPH_CNP_EN, 0x10,
4769 1 << 4);
4770 pa_turned_on = true;
4771 }
4772 if (test_and_clear_bit(TAIKO_HPHL_PA_OFF_ACK,
4773 &taiko->hph_pa_dac_state)) {
4774 pr_debug("%s: HPHL clear flag and enable PA\n", __func__);
4775 snd_soc_update_bits(taiko->codec, TAIKO_A_RX_HPH_CNP_EN, 0x20,
4776 1 << 5);
4777 pa_turned_on = true;
4778 }
4779
4780 if (pa_turned_on) {
4781 pr_debug("%s: PA was turned off by MBHC and not by DAPM\n",
4782 __func__);
4783 usleep_range(wg_time * 1000, wg_time * 1000);
4784 }
4785}
4786
4787/* called under codec_resource_lock acquisition */
4788static void taiko_codec_report_plug(struct snd_soc_codec *codec, int insertion,
4789 enum snd_jack_types jack_type)
4790{
4791 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
4792
4793 if (!insertion) {
4794 /* Report removal */
4795 taiko->hph_status &= ~jack_type;
4796 if (taiko->mbhc_cfg.headset_jack) {
4797 /* cancel possibly scheduled btn work and
4798 * report release if we reported button press */
4799 if (taiko_cancel_btn_work(taiko)) {
4800 pr_debug("%s: button press is canceled\n",
4801 __func__);
4802 } else if (taiko->buttons_pressed) {
4803 pr_debug("%s: release of button press%d\n",
4804 __func__, jack_type);
4805 taiko_snd_soc_jack_report(taiko,
4806 taiko->mbhc_cfg.button_jack, 0,
4807 taiko->buttons_pressed);
4808 taiko->buttons_pressed &=
4809 ~TAIKO_JACK_BUTTON_MASK;
4810 }
4811 pr_debug("%s: Reporting removal %d(%x)\n", __func__,
4812 jack_type, taiko->hph_status);
4813 taiko_snd_soc_jack_report(taiko,
4814 taiko->mbhc_cfg.headset_jack,
4815 taiko->hph_status,
4816 TAIKO_JACK_MASK);
4817 }
4818 taiko_set_and_turnoff_hph_padac(codec);
4819 hphocp_off_report(taiko, SND_JACK_OC_HPHR,
4820 TAIKO_IRQ_HPH_PA_OCPR_FAULT);
4821 hphocp_off_report(taiko, SND_JACK_OC_HPHL,
4822 TAIKO_IRQ_HPH_PA_OCPL_FAULT);
4823 taiko->current_plug = PLUG_TYPE_NONE;
4824 taiko->mbhc_polling_active = false;
4825 } else {
4826 /* Report insertion */
4827 taiko->hph_status |= jack_type;
4828
4829 if (jack_type == SND_JACK_HEADPHONE)
4830 taiko->current_plug = PLUG_TYPE_HEADPHONE;
4831 else if (jack_type == SND_JACK_UNSUPPORTED)
4832 taiko->current_plug = PLUG_TYPE_GND_MIC_SWAP;
4833 else if (jack_type == SND_JACK_HEADSET) {
4834 taiko->mbhc_polling_active = true;
4835 taiko->current_plug = PLUG_TYPE_HEADSET;
4836 }
4837 if (taiko->mbhc_cfg.headset_jack) {
4838 pr_debug("%s: Reporting insertion %d(%x)\n", __func__,
4839 jack_type, taiko->hph_status);
4840 taiko_snd_soc_jack_report(taiko,
4841 taiko->mbhc_cfg.headset_jack,
4842 taiko->hph_status,
4843 TAIKO_JACK_MASK);
4844 }
4845 taiko_clr_and_turnon_hph_padac(taiko);
4846 }
4847}
4848
4849static int taiko_codec_enable_hs_detect(struct snd_soc_codec *codec,
4850 int insertion, int trigger,
4851 bool padac_off)
4852{
4853 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
4854 int central_bias_enabled = 0;
4855 const struct taiko_mbhc_general_cfg *generic =
4856 TAIKO_MBHC_CAL_GENERAL_PTR(taiko->mbhc_cfg.calibration);
4857 const struct taiko_mbhc_plug_detect_cfg *plug_det =
4858 TAIKO_MBHC_CAL_PLUG_DET_PTR(taiko->mbhc_cfg.calibration);
4859
4860 if (!taiko->mbhc_cfg.calibration) {
4861 pr_err("Error, no taiko calibration\n");
4862 return -EINVAL;
4863 }
4864
4865 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_INT_CTL, 0x1, 0);
4866
4867 /* Make sure mic bias and Mic line schmitt trigger
4868 * are turned OFF
4869 */
4870 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.ctl_reg, 0x01, 0x01);
4871 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.mbhc_reg, 0x90, 0x00);
4872
4873 if (insertion) {
4874 taiko_codec_switch_micbias(codec, 0);
4875
4876 /* DAPM can manipulate PA/DAC bits concurrently */
4877 if (padac_off == true)
4878 taiko_set_and_turnoff_hph_padac(codec);
4879
4880 if (trigger & MBHC_USE_HPHL_TRIGGER) {
4881 /* Enable HPH Schmitt Trigger */
4882 snd_soc_update_bits(codec, TAIKO_A_MBHC_HPH, 0x11,
4883 0x11);
4884 snd_soc_update_bits(codec, TAIKO_A_MBHC_HPH, 0x0C,
4885 plug_det->hph_current << 2);
4886 snd_soc_update_bits(codec, TAIKO_A_MBHC_HPH, 0x02,
4887 0x02);
4888 }
4889 if (trigger & MBHC_USE_MB_TRIGGER) {
4890 /* enable the mic line schmitt trigger */
4891 snd_soc_update_bits(codec,
4892 taiko->mbhc_bias_regs.mbhc_reg,
4893 0x60, plug_det->mic_current << 5);
4894 snd_soc_update_bits(codec,
4895 taiko->mbhc_bias_regs.mbhc_reg,
4896 0x80, 0x80);
4897 usleep_range(plug_det->t_mic_pid, plug_det->t_mic_pid);
4898 snd_soc_update_bits(codec,
4899 taiko->mbhc_bias_regs.ctl_reg, 0x01,
4900 0x00);
4901 snd_soc_update_bits(codec,
4902 taiko->mbhc_bias_regs.mbhc_reg,
4903 0x10, 0x10);
4904 }
4905
4906 /* setup for insetion detection */
4907 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_INT_CTL, 0x2, 0);
4908 } else {
4909 pr_debug("setup for removal detection\n");
4910 /* Make sure the HPH schmitt trigger is OFF */
4911 snd_soc_update_bits(codec, TAIKO_A_MBHC_HPH, 0x12, 0x00);
4912
4913 /* enable the mic line schmitt trigger */
4914 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.ctl_reg,
4915 0x01, 0x00);
4916 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.mbhc_reg, 0x60,
4917 plug_det->mic_current << 5);
4918 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.mbhc_reg,
4919 0x80, 0x80);
4920 usleep_range(plug_det->t_mic_pid, plug_det->t_mic_pid);
4921 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.mbhc_reg,
4922 0x10, 0x10);
4923
4924 /* Setup for low power removal detection */
4925 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_INT_CTL, 0x2, 0x2);
4926 }
4927
4928 if (snd_soc_read(codec, TAIKO_A_CDC_MBHC_B1_CTL) & 0x4) {
4929 /* called called by interrupt */
4930 if (!(taiko->clock_active)) {
4931 taiko_codec_enable_config_mode(codec, 1);
4932 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_B1_CTL,
4933 0x06, 0);
4934 usleep_range(generic->t_shutdown_plug_rem,
4935 generic->t_shutdown_plug_rem);
4936 taiko_codec_enable_config_mode(codec, 0);
4937 } else
4938 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_B1_CTL,
4939 0x06, 0);
4940 }
4941
4942 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.int_rbias, 0x80, 0);
4943
4944 /* If central bandgap disabled */
4945 if (!(snd_soc_read(codec, TAIKO_A_PIN_CTL_OE1) & 1)) {
4946 snd_soc_update_bits(codec, TAIKO_A_PIN_CTL_OE1, 0x3, 0x3);
4947 usleep_range(generic->t_bg_fast_settle,
4948 generic->t_bg_fast_settle);
4949 central_bias_enabled = 1;
4950 }
4951
4952 /* If LDO_H disabled */
4953 if (snd_soc_read(codec, TAIKO_A_PIN_CTL_OE0) & 0x80) {
4954 snd_soc_update_bits(codec, TAIKO_A_PIN_CTL_OE0, 0x10, 0);
4955 snd_soc_update_bits(codec, TAIKO_A_PIN_CTL_OE0, 0x80, 0x80);
4956 usleep_range(generic->t_ldoh, generic->t_ldoh);
4957 snd_soc_update_bits(codec, TAIKO_A_PIN_CTL_OE0, 0x80, 0);
4958
4959 if (central_bias_enabled)
4960 snd_soc_update_bits(codec, TAIKO_A_PIN_CTL_OE1, 0x1, 0);
4961 }
4962
4963 snd_soc_update_bits(codec, taiko->reg_addr.micb_4_mbhc, 0x3,
4964 taiko->mbhc_cfg.micbias);
4965
4966 wcd9xxx_enable_irq(codec->control_data, TAIKO_IRQ_MBHC_INSERTION);
4967 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_INT_CTL, 0x1, 0x1);
4968 return 0;
4969}
4970
4971static u16 taiko_codec_v_sta_dce(struct snd_soc_codec *codec, bool dce,
4972 s16 vin_mv)
4973{
4974 struct taiko_priv *taiko;
4975 s16 diff, zero;
4976 u32 mb_mv, in;
4977 u16 value;
4978
4979 taiko = snd_soc_codec_get_drvdata(codec);
4980 mb_mv = taiko->mbhc_data.micb_mv;
4981
4982 if (mb_mv == 0) {
4983 pr_err("%s: Mic Bias voltage is set to zero\n", __func__);
4984 return -EINVAL;
4985 }
4986
4987 if (dce) {
4988 diff = (taiko->mbhc_data.dce_mb) - (taiko->mbhc_data.dce_z);
4989 zero = (taiko->mbhc_data.dce_z);
4990 } else {
4991 diff = (taiko->mbhc_data.sta_mb) - (taiko->mbhc_data.sta_z);
4992 zero = (taiko->mbhc_data.sta_z);
4993 }
4994 in = (u32) diff * vin_mv;
4995
4996 value = (u16) (in / mb_mv) + zero;
4997 return value;
4998}
4999
5000static s32 taiko_codec_sta_dce_v(struct snd_soc_codec *codec, s8 dce,
5001 u16 bias_value)
5002{
5003 struct taiko_priv *taiko;
5004 s16 value, z, mb;
5005 s32 mv;
5006
5007 taiko = snd_soc_codec_get_drvdata(codec);
5008 value = bias_value;
5009 if (dce) {
5010 z = (taiko->mbhc_data.dce_z);
5011 mb = (taiko->mbhc_data.dce_mb);
5012 mv = (value - z) * (s32)taiko->mbhc_data.micb_mv / (mb - z);
5013 } else {
5014 z = (taiko->mbhc_data.sta_z);
5015 mb = (taiko->mbhc_data.sta_mb);
5016 mv = (value - z) * (s32)taiko->mbhc_data.micb_mv / (mb - z);
5017 }
5018
5019 return mv;
5020}
5021
5022static void btn_lpress_fn(struct work_struct *work)
5023{
5024 struct delayed_work *delayed_work;
5025 struct taiko_priv *taiko;
5026 short bias_value;
5027 int dce_mv, sta_mv;
5028 struct wcd9xxx *core;
5029
5030 pr_debug("%s:\n", __func__);
5031
5032 delayed_work = to_delayed_work(work);
5033 taiko = container_of(delayed_work, struct taiko_priv, mbhc_btn_dwork);
5034 core = dev_get_drvdata(taiko->codec->dev->parent);
5035
5036 if (taiko) {
5037 if (taiko->mbhc_cfg.button_jack) {
5038 bias_value = taiko_codec_read_sta_result(taiko->codec);
5039 sta_mv = taiko_codec_sta_dce_v(taiko->codec, 0,
5040 bias_value);
5041 bias_value = taiko_codec_read_dce_result(taiko->codec);
5042 dce_mv = taiko_codec_sta_dce_v(taiko->codec, 1,
5043 bias_value);
5044 pr_debug("%s: Reporting long button press event\n",
5045 __func__);
5046 pr_debug("%s: STA: %d, DCE: %d\n", __func__, sta_mv,
5047 dce_mv);
5048 taiko_snd_soc_jack_report(taiko,
5049 taiko->mbhc_cfg.button_jack,
5050 taiko->buttons_pressed,
5051 taiko->buttons_pressed);
5052 }
5053 } else {
5054 pr_err("%s: Bad taiko private data\n", __func__);
5055 }
5056
5057 pr_debug("%s: leave\n", __func__);
5058 wcd9xxx_unlock_sleep(core);
5059}
5060
5061void taiko_mbhc_cal(struct snd_soc_codec *codec)
5062{
5063 struct taiko_priv *taiko;
5064 struct taiko_mbhc_btn_detect_cfg *btn_det;
5065 u8 cfilt_mode, bg_mode;
5066 u8 ncic, nmeas, navg;
5067 u32 mclk_rate;
5068 u32 dce_wait, sta_wait;
5069 u8 *n_cic;
5070 void *calibration;
5071
5072 taiko = snd_soc_codec_get_drvdata(codec);
5073 calibration = taiko->mbhc_cfg.calibration;
5074
5075 wcd9xxx_disable_irq(codec->control_data, TAIKO_IRQ_MBHC_POTENTIAL);
5076 taiko_turn_onoff_rel_detection(codec, false);
5077
5078 /* First compute the DCE / STA wait times
5079 * depending on tunable parameters.
5080 * The value is computed in microseconds
5081 */
5082 btn_det = TAIKO_MBHC_CAL_BTN_DET_PTR(calibration);
5083 n_cic = taiko_mbhc_cal_btn_det_mp(btn_det, TAIKO_BTN_DET_N_CIC);
5084 ncic = n_cic[taiko_codec_mclk_index(taiko)];
5085 nmeas = TAIKO_MBHC_CAL_BTN_DET_PTR(calibration)->n_meas;
5086 navg = TAIKO_MBHC_CAL_GENERAL_PTR(calibration)->mbhc_navg;
5087 mclk_rate = taiko->mbhc_cfg.mclk_rate;
5088 dce_wait = (1000 * 512 * ncic * (nmeas + 1)) / (mclk_rate / 1000);
5089 sta_wait = (1000 * 128 * (navg + 1)) / (mclk_rate / 1000);
5090
5091 taiko->mbhc_data.t_dce = dce_wait;
5092 taiko->mbhc_data.t_sta = sta_wait;
5093
5094 /* LDOH and CFILT are already configured during pdata handling.
5095 * Only need to make sure CFILT and bandgap are in Fast mode.
5096 * Need to restore defaults once calculation is done.
5097 */
5098 cfilt_mode = snd_soc_read(codec, taiko->mbhc_bias_regs.cfilt_ctl);
5099 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.cfilt_ctl, 0x40, 0x00);
5100 bg_mode = snd_soc_update_bits(codec, TAIKO_A_BIAS_CENTRAL_BG_CTL, 0x02,
5101 0x02);
5102
5103 /* Micbias, CFILT, LDOH, MBHC MUX mode settings
5104 * to perform ADC calibration
5105 */
5106 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.ctl_reg, 0x60,
5107 taiko->mbhc_cfg.micbias << 5);
5108 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.ctl_reg, 0x01, 0x00);
5109 snd_soc_update_bits(codec, TAIKO_A_LDO_H_MODE_1, 0x60, 0x60);
5110 snd_soc_write(codec, TAIKO_A_TX_7_MBHC_TEST_CTL, 0x78);
5111 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_B1_CTL, 0x04, 0x04);
5112
5113 /* DCE measurement for 0 volts */
5114 snd_soc_write(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x0A);
5115 snd_soc_write(codec, TAIKO_A_CDC_MBHC_EN_CTL, 0x04);
5116 snd_soc_write(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x02);
5117 snd_soc_write(codec, TAIKO_A_MBHC_SCALING_MUX_1, 0x81);
5118 usleep_range(100, 100);
5119 snd_soc_write(codec, TAIKO_A_CDC_MBHC_EN_CTL, 0x04);
5120 usleep_range(taiko->mbhc_data.t_dce, taiko->mbhc_data.t_dce);
5121 taiko->mbhc_data.dce_z = taiko_codec_read_dce_result(codec);
5122
5123 /* DCE measurment for MB voltage */
5124 snd_soc_write(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x0A);
5125 snd_soc_write(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x02);
5126 snd_soc_write(codec, TAIKO_A_MBHC_SCALING_MUX_1, 0x82);
5127 usleep_range(100, 100);
5128 snd_soc_write(codec, TAIKO_A_CDC_MBHC_EN_CTL, 0x04);
5129 usleep_range(taiko->mbhc_data.t_dce, taiko->mbhc_data.t_dce);
5130 taiko->mbhc_data.dce_mb = taiko_codec_read_dce_result(codec);
5131
5132 /* Sta measuremnt for 0 volts */
5133 snd_soc_write(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x0A);
5134 snd_soc_write(codec, TAIKO_A_CDC_MBHC_EN_CTL, 0x02);
5135 snd_soc_write(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x02);
5136 snd_soc_write(codec, TAIKO_A_MBHC_SCALING_MUX_1, 0x81);
5137 usleep_range(100, 100);
5138 snd_soc_write(codec, TAIKO_A_CDC_MBHC_EN_CTL, 0x02);
5139 usleep_range(taiko->mbhc_data.t_sta, taiko->mbhc_data.t_sta);
5140 taiko->mbhc_data.sta_z = taiko_codec_read_sta_result(codec);
5141
5142 /* STA Measurement for MB Voltage */
5143 snd_soc_write(codec, TAIKO_A_MBHC_SCALING_MUX_1, 0x82);
5144 usleep_range(100, 100);
5145 snd_soc_write(codec, TAIKO_A_CDC_MBHC_EN_CTL, 0x02);
5146 usleep_range(taiko->mbhc_data.t_sta, taiko->mbhc_data.t_sta);
5147 taiko->mbhc_data.sta_mb = taiko_codec_read_sta_result(codec);
5148
5149 /* Restore default settings. */
5150 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_B1_CTL, 0x04, 0x00);
5151 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.cfilt_ctl, 0x40,
5152 cfilt_mode);
5153 snd_soc_update_bits(codec, TAIKO_A_BIAS_CENTRAL_BG_CTL, 0x02, bg_mode);
5154
5155 snd_soc_write(codec, TAIKO_A_MBHC_SCALING_MUX_1, 0x84);
5156 usleep_range(100, 100);
5157
5158 wcd9xxx_enable_irq(codec->control_data, TAIKO_IRQ_MBHC_POTENTIAL);
5159 taiko_turn_onoff_rel_detection(codec, true);
5160}
5161
5162void *taiko_mbhc_cal_btn_det_mp(const struct taiko_mbhc_btn_detect_cfg *btn_det,
5163 const enum taiko_mbhc_btn_det_mem mem)
5164{
5165 void *ret = &btn_det->_v_btn_low;
5166
5167 switch (mem) {
5168 case TAIKO_BTN_DET_GAIN:
5169 ret += sizeof(btn_det->_n_cic);
5170 case TAIKO_BTN_DET_N_CIC:
5171 ret += sizeof(btn_det->_n_ready);
5172 case TAIKO_BTN_DET_N_READY:
5173 ret += sizeof(btn_det->_v_btn_high[0]) * btn_det->num_btn;
5174 case TAIKO_BTN_DET_V_BTN_HIGH:
5175 ret += sizeof(btn_det->_v_btn_low[0]) * btn_det->num_btn;
5176 case TAIKO_BTN_DET_V_BTN_LOW:
5177 /* do nothing */
5178 break;
5179 default:
5180 ret = NULL;
5181 }
5182
5183 return ret;
5184}
5185
5186static s16 taiko_scale_v_micb_vddio(struct taiko_priv *taiko, int v,
5187 bool tovddio)
5188{
5189 int r;
5190 int vddio_k, mb_k;
5191 vddio_k = taiko_find_k_value(taiko->pdata->micbias.ldoh_v,
5192 VDDIO_MICBIAS_MV);
5193 mb_k = taiko_find_k_value(taiko->pdata->micbias.ldoh_v,
5194 taiko->mbhc_data.micb_mv);
5195 if (tovddio)
5196 r = v * vddio_k / mb_k;
5197 else
5198 r = v * mb_k / vddio_k;
5199 return r;
5200}
5201
5202static void taiko_mbhc_calc_thres(struct snd_soc_codec *codec)
5203{
5204 struct taiko_priv *taiko;
5205 s16 btn_mv = 0, btn_delta_mv;
5206 struct taiko_mbhc_btn_detect_cfg *btn_det;
5207 struct taiko_mbhc_plug_type_cfg *plug_type;
5208 u16 *btn_high;
5209 u8 *n_ready;
5210 int i;
5211
5212 taiko = snd_soc_codec_get_drvdata(codec);
5213 btn_det = TAIKO_MBHC_CAL_BTN_DET_PTR(taiko->mbhc_cfg.calibration);
5214 plug_type = TAIKO_MBHC_CAL_PLUG_TYPE_PTR(taiko->mbhc_cfg.calibration);
5215
5216 n_ready = taiko_mbhc_cal_btn_det_mp(btn_det, TAIKO_BTN_DET_N_READY);
5217 if (taiko->mbhc_cfg.mclk_rate == TAIKO_MCLK_RATE_12288KHZ) {
5218 taiko->mbhc_data.npoll = 4;
5219 taiko->mbhc_data.nbounce_wait = 30;
5220 } else if (taiko->mbhc_cfg.mclk_rate == TAIKO_MCLK_RATE_9600KHZ) {
5221 taiko->mbhc_data.npoll = 7;
5222 taiko->mbhc_data.nbounce_wait = 23;
5223 }
5224
5225 taiko->mbhc_data.t_sta_dce = ((1000 * 256) /
5226 (taiko->mbhc_cfg.mclk_rate / 1000) *
5227 n_ready[taiko_codec_mclk_index(taiko)]) +
5228 10;
5229 taiko->mbhc_data.v_ins_hu =
5230 taiko_codec_v_sta_dce(codec, STA, plug_type->v_hs_max);
5231 taiko->mbhc_data.v_ins_h =
5232 taiko_codec_v_sta_dce(codec, DCE, plug_type->v_hs_max);
5233
5234 taiko->mbhc_data.v_inval_ins_low = TAIKO_MBHC_FAKE_INSERT_LOW;
5235 if (taiko->mbhc_cfg.gpio)
5236 taiko->mbhc_data.v_inval_ins_high =
5237 TAIKO_MBHC_FAKE_INSERT_HIGH;
5238 else
5239 taiko->mbhc_data.v_inval_ins_high =
5240 TAIKO_MBHC_FAKE_INS_HIGH_NO_GPIO;
5241
5242 if (taiko->mbhc_data.micb_mv != VDDIO_MICBIAS_MV) {
5243 taiko->mbhc_data.adj_v_hs_max =
5244 taiko_scale_v_micb_vddio(taiko, plug_type->v_hs_max, true);
5245 taiko->mbhc_data.adj_v_ins_hu =
5246 taiko_codec_v_sta_dce(codec, STA,
5247 taiko->mbhc_data.adj_v_hs_max);
5248 taiko->mbhc_data.adj_v_ins_h =
5249 taiko_codec_v_sta_dce(codec, DCE,
5250 taiko->mbhc_data.adj_v_hs_max);
5251 taiko->mbhc_data.v_inval_ins_low =
5252 taiko_scale_v_micb_vddio(taiko,
5253 taiko->mbhc_data.v_inval_ins_low,
5254 false);
5255 taiko->mbhc_data.v_inval_ins_high =
5256 taiko_scale_v_micb_vddio(taiko,
5257 taiko->mbhc_data.v_inval_ins_high,
5258 false);
5259 }
5260
5261 btn_high = taiko_mbhc_cal_btn_det_mp(btn_det, TAIKO_BTN_DET_V_BTN_HIGH);
5262 for (i = 0; i < btn_det->num_btn; i++)
5263 btn_mv = btn_high[i] > btn_mv ? btn_high[i] : btn_mv;
5264
5265 taiko->mbhc_data.v_b1_h = taiko_codec_v_sta_dce(codec, DCE, btn_mv);
5266 btn_delta_mv = btn_mv + btn_det->v_btn_press_delta_sta;
5267 taiko->mbhc_data.v_b1_hu =
5268 taiko_codec_v_sta_dce(codec, STA, btn_delta_mv);
5269
5270 btn_delta_mv = btn_mv + btn_det->v_btn_press_delta_cic;
5271
5272 taiko->mbhc_data.v_b1_huc =
5273 taiko_codec_v_sta_dce(codec, DCE, btn_delta_mv);
5274
5275 taiko->mbhc_data.v_brh = taiko->mbhc_data.v_b1_h;
5276 taiko->mbhc_data.v_brl = TAIKO_MBHC_BUTTON_MIN;
5277
5278 taiko->mbhc_data.v_no_mic =
5279 taiko_codec_v_sta_dce(codec, STA, plug_type->v_no_mic);
5280}
5281
5282void taiko_mbhc_init(struct snd_soc_codec *codec)
5283{
5284 struct taiko_priv *taiko;
5285 struct taiko_mbhc_general_cfg *generic;
5286 struct taiko_mbhc_btn_detect_cfg *btn_det;
5287 int n;
5288 u8 *n_cic, *gain;
5289
5290 taiko = snd_soc_codec_get_drvdata(codec);
5291 generic = TAIKO_MBHC_CAL_GENERAL_PTR(taiko->mbhc_cfg.calibration);
5292 btn_det = TAIKO_MBHC_CAL_BTN_DET_PTR(taiko->mbhc_cfg.calibration);
5293
5294 for (n = 0; n < 8; n++) {
5295 snd_soc_update_bits(codec,
5296 TAIKO_A_CDC_MBHC_FIR_B1_CFG,
5297 0x07, n);
5298 snd_soc_write(codec, TAIKO_A_CDC_MBHC_FIR_B2_CFG,
5299 btn_det->c[n]);
5300 }
5301
5302 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_B2_CTL, 0x07,
5303 btn_det->nc);
5304
5305 n_cic = taiko_mbhc_cal_btn_det_mp(btn_det, TAIKO_BTN_DET_N_CIC);
5306 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_TIMER_B6_CTL, 0xFF,
5307 n_cic[taiko_codec_mclk_index(taiko)]);
5308
5309 gain = taiko_mbhc_cal_btn_det_mp(btn_det, TAIKO_BTN_DET_GAIN);
5310 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_B2_CTL, 0x78,
5311 gain[taiko_codec_mclk_index(taiko)] << 3);
5312
5313 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_TIMER_B4_CTL, 0x70,
5314 generic->mbhc_nsa << 4);
5315
5316 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_TIMER_B4_CTL, 0x0F,
5317 btn_det->n_meas);
5318
5319 snd_soc_write(codec, TAIKO_A_CDC_MBHC_TIMER_B5_CTL, generic->mbhc_navg);
5320
5321 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_B1_CTL, 0x80, 0x80);
5322
5323 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_B1_CTL, 0x78,
5324 btn_det->mbhc_nsc << 3);
5325
5326 snd_soc_update_bits(codec, taiko->reg_addr.micb_4_mbhc, 0x03,
5327 TAIKO_MICBIAS2);
5328
5329 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_B1_CTL, 0x02, 0x02);
5330
5331 snd_soc_update_bits(codec, TAIKO_A_MBHC_SCALING_MUX_2, 0xF0, 0xF0);
5332}
5333
5334static bool taiko_mbhc_fw_validate(const struct firmware *fw)
5335{
5336 u32 cfg_offset;
5337 struct taiko_mbhc_imped_detect_cfg *imped_cfg;
5338 struct taiko_mbhc_btn_detect_cfg *btn_cfg;
5339
5340 if (fw->size < TAIKO_MBHC_CAL_MIN_SIZE)
5341 return false;
5342
5343 /* previous check guarantees that there is enough fw data up
5344 * to num_btn
5345 */
5346 btn_cfg = TAIKO_MBHC_CAL_BTN_DET_PTR(fw->data);
5347 cfg_offset = (u32) ((void *) btn_cfg - (void *) fw->data);
5348 if (fw->size < (cfg_offset + TAIKO_MBHC_CAL_BTN_SZ(btn_cfg)))
5349 return false;
5350
5351 /* previous check guarantees that there is enough fw data up
5352 * to start of impedance detection configuration
5353 */
5354 imped_cfg = TAIKO_MBHC_CAL_IMPED_DET_PTR(fw->data);
5355 cfg_offset = (u32) ((void *) imped_cfg - (void *) fw->data);
5356
5357 if (fw->size < (cfg_offset + TAIKO_MBHC_CAL_IMPED_MIN_SZ))
5358 return false;
5359
5360 if (fw->size < (cfg_offset + TAIKO_MBHC_CAL_IMPED_SZ(imped_cfg)))
5361 return false;
5362
5363 return true;
5364}
5365
5366/* called under codec_resource_lock acquisition */
5367static int taiko_determine_button(const struct taiko_priv *priv,
5368 const s32 micmv)
5369{
5370 s16 *v_btn_low, *v_btn_high;
5371 struct taiko_mbhc_btn_detect_cfg *btn_det;
5372 int i, btn = -1;
5373
5374 btn_det = TAIKO_MBHC_CAL_BTN_DET_PTR(priv->mbhc_cfg.calibration);
5375 v_btn_low = taiko_mbhc_cal_btn_det_mp(btn_det, TAIKO_BTN_DET_V_BTN_LOW);
5376 v_btn_high = taiko_mbhc_cal_btn_det_mp(btn_det,
5377 TAIKO_BTN_DET_V_BTN_HIGH);
5378
5379 for (i = 0; i < btn_det->num_btn; i++) {
5380 if ((v_btn_low[i] <= micmv) && (v_btn_high[i] >= micmv)) {
5381 btn = i;
5382 break;
5383 }
5384 }
5385
5386 if (btn == -1)
5387 pr_debug("%s: couldn't find button number for mic mv %d\n",
5388 __func__, micmv);
5389
5390 return btn;
5391}
5392
5393static int taiko_get_button_mask(const int btn)
5394{
5395 int mask = 0;
5396 switch (btn) {
5397 case 0:
5398 mask = SND_JACK_BTN_0;
5399 break;
5400 case 1:
5401 mask = SND_JACK_BTN_1;
5402 break;
5403 case 2:
5404 mask = SND_JACK_BTN_2;
5405 break;
5406 case 3:
5407 mask = SND_JACK_BTN_3;
5408 break;
5409 case 4:
5410 mask = SND_JACK_BTN_4;
5411 break;
5412 case 5:
5413 mask = SND_JACK_BTN_5;
5414 break;
5415 case 6:
5416 mask = SND_JACK_BTN_6;
5417 break;
5418 case 7:
5419 mask = SND_JACK_BTN_7;
5420 break;
5421 }
5422 return mask;
5423}
5424
5425static irqreturn_t taiko_dce_handler(int irq, void *data)
5426{
5427 int i, mask;
5428 short dce, sta;
5429 s32 mv, mv_s, stamv_s;
5430 bool vddio;
5431 int btn = -1, meas = 0;
5432 struct taiko_priv *priv = data;
5433 const struct taiko_mbhc_btn_detect_cfg *d =
5434 TAIKO_MBHC_CAL_BTN_DET_PTR(priv->mbhc_cfg.calibration);
5435 short btnmeas[d->n_btn_meas + 1];
5436 struct snd_soc_codec *codec = priv->codec;
5437 struct wcd9xxx *core = dev_get_drvdata(priv->codec->dev->parent);
5438 int n_btn_meas = d->n_btn_meas;
5439 u8 mbhc_status = snd_soc_read(codec, TAIKO_A_CDC_MBHC_B1_STATUS) & 0x3E;
5440
5441 pr_debug("%s: enter\n", __func__);
5442
5443 TAIKO_ACQUIRE_LOCK(priv->codec_resource_lock);
5444 if (priv->mbhc_state == MBHC_STATE_POTENTIAL_RECOVERY) {
5445 pr_debug("%s: mbhc is being recovered, skip button press\n",
5446 __func__);
5447 goto done;
5448 }
5449
5450 priv->mbhc_state = MBHC_STATE_POTENTIAL;
5451
5452 if (!priv->mbhc_polling_active) {
5453 pr_warn("%s: mbhc polling is not active, skip button press\n",
5454 __func__);
5455 goto done;
5456 }
5457
5458 dce = taiko_codec_read_dce_result(codec);
5459 mv = taiko_codec_sta_dce_v(codec, 1, dce);
5460
5461 /* If GPIO interrupt already kicked in, ignore button press */
5462 if (priv->in_gpio_handler) {
5463 pr_debug("%s: GPIO State Changed, ignore button press\n",
5464 __func__);
5465 btn = -1;
5466 goto done;
5467 }
5468
5469 vddio = (priv->mbhc_data.micb_mv != VDDIO_MICBIAS_MV &&
5470 priv->mbhc_micbias_switched);
5471 mv_s = vddio ? taiko_scale_v_micb_vddio(priv, mv, false) : mv;
5472
5473 if (mbhc_status != TAIKO_MBHC_STATUS_REL_DETECTION) {
5474 if (priv->mbhc_last_resume &&
5475 !time_after(jiffies, priv->mbhc_last_resume + HZ)) {
5476 pr_debug("%s: Button is already released shortly after resume\n",
5477 __func__);
5478 n_btn_meas = 0;
5479 } else {
5480 pr_debug("%s: Button is already released without resume",
5481 __func__);
5482 sta = taiko_codec_read_sta_result(codec);
5483 stamv_s = taiko_codec_sta_dce_v(codec, 0, sta);
5484 if (vddio)
5485 stamv_s = taiko_scale_v_micb_vddio(priv,
5486 stamv_s,
5487 false);
5488 btn = taiko_determine_button(priv, mv_s);
5489 if (btn != taiko_determine_button(priv, stamv_s))
5490 btn = -1;
5491 goto done;
5492 }
5493 }
5494
5495 /* determine pressed button */
5496 btnmeas[meas++] = taiko_determine_button(priv, mv_s);
5497 pr_debug("%s: meas %d - DCE %d,%d,%d button %d\n", __func__,
5498 meas - 1, dce, mv, mv_s, btnmeas[meas - 1]);
5499 if (n_btn_meas == 0)
5500 btn = btnmeas[0];
5501 for (; ((d->n_btn_meas) && (meas < (d->n_btn_meas + 1))); meas++) {
5502 dce = taiko_codec_sta_dce(codec, 1, false);
5503 mv = taiko_codec_sta_dce_v(codec, 1, dce);
5504 mv_s = vddio ? taiko_scale_v_micb_vddio(priv, mv, false) : mv;
5505
5506 btnmeas[meas] = taiko_determine_button(priv, mv_s);
5507 pr_debug("%s: meas %d - DCE %d,%d,%d button %d\n",
5508 __func__, meas, dce, mv, mv_s, btnmeas[meas]);
5509 /* if large enough measurements are collected,
5510 * start to check if last all n_btn_con measurements were
5511 * in same button low/high range */
5512 if (meas + 1 >= d->n_btn_con) {
5513 for (i = 0; i < d->n_btn_con; i++)
5514 if ((btnmeas[meas] < 0) ||
5515 (btnmeas[meas] != btnmeas[meas - i]))
5516 break;
5517 if (i == d->n_btn_con) {
5518 /* button pressed */
5519 btn = btnmeas[meas];
5520 break;
5521 } else if ((n_btn_meas - meas) < (d->n_btn_con - 1)) {
5522 /* if left measurements are less than n_btn_con,
5523 * it's impossible to find button number */
5524 break;
5525 }
5526 }
5527 }
5528
5529 if (btn >= 0) {
5530 if (priv->in_gpio_handler) {
5531 pr_debug(
5532 "%s: GPIO already triggered, ignore button press\n",
5533 __func__);
5534 goto done;
5535 }
5536 mask = taiko_get_button_mask(btn);
5537 priv->buttons_pressed |= mask;
5538 wcd9xxx_lock_sleep(core);
5539 if (schedule_delayed_work(&priv->mbhc_btn_dwork,
5540 msecs_to_jiffies(400)) == 0) {
5541 WARN(1, "Button pressed twice without release event\n");
5542 wcd9xxx_unlock_sleep(core);
5543 }
5544 } else {
5545 pr_debug("%s: bogus button press, too short press?\n",
5546 __func__);
5547 }
5548
5549 done:
5550 pr_debug("%s: leave\n", __func__);
5551 TAIKO_RELEASE_LOCK(priv->codec_resource_lock);
5552 return IRQ_HANDLED;
5553}
5554
5555static int taiko_is_fake_press(struct taiko_priv *priv)
5556{
5557 int i;
5558 int r = 0;
5559 struct snd_soc_codec *codec = priv->codec;
5560 const int dces = MBHC_NUM_DCE_PLUG_DETECT;
5561 s16 mb_v, v_ins_hu, v_ins_h;
5562
5563 v_ins_hu = taiko_get_current_v_ins(priv, true);
5564 v_ins_h = taiko_get_current_v_ins(priv, false);
5565
5566 for (i = 0; i < dces; i++) {
5567 usleep_range(10000, 10000);
5568 if (i == 0) {
5569 mb_v = taiko_codec_sta_dce(codec, 0, true);
5570 pr_debug("%s: STA[0]: %d,%d\n", __func__, mb_v,
5571 taiko_codec_sta_dce_v(codec, 0, mb_v));
5572 if (mb_v < (s16)priv->mbhc_data.v_b1_hu ||
5573 mb_v > v_ins_hu) {
5574 r = 1;
5575 break;
5576 }
5577 } else {
5578 mb_v = taiko_codec_sta_dce(codec, 1, true);
5579 pr_debug("%s: DCE[%d]: %d,%d\n", __func__, i, mb_v,
5580 taiko_codec_sta_dce_v(codec, 1, mb_v));
5581 if (mb_v < (s16)priv->mbhc_data.v_b1_h ||
5582 mb_v > v_ins_h) {
5583 r = 1;
5584 break;
5585 }
5586 }
5587 }
5588
5589 return r;
5590}
5591
5592static irqreturn_t taiko_release_handler(int irq, void *data)
5593{
5594 int ret;
5595 struct taiko_priv *priv = data;
5596 struct snd_soc_codec *codec = priv->codec;
5597
5598 pr_debug("%s: enter\n", __func__);
5599
5600 TAIKO_ACQUIRE_LOCK(priv->codec_resource_lock);
5601 priv->mbhc_state = MBHC_STATE_RELEASE;
5602
5603 taiko_codec_drive_v_to_micbias(codec, 10000);
5604
5605 if (priv->buttons_pressed & TAIKO_JACK_BUTTON_MASK) {
5606 ret = taiko_cancel_btn_work(priv);
5607 if (ret == 0) {
5608 pr_debug("%s: Reporting long button release event\n",
5609 __func__);
5610 if (priv->mbhc_cfg.button_jack)
5611 taiko_snd_soc_jack_report(priv,
5612 priv->mbhc_cfg.button_jack, 0,
5613 priv->buttons_pressed);
5614 } else {
5615 if (taiko_is_fake_press(priv)) {
5616 pr_debug("%s: Fake button press interrupt\n",
5617 __func__);
5618 } else if (priv->mbhc_cfg.button_jack) {
5619 if (priv->in_gpio_handler) {
5620 pr_debug("%s: GPIO kicked in, ignore\n",
5621 __func__);
5622 } else {
5623 pr_debug(
5624 "%s: Reporting short button press and release\n",
5625 __func__);
5626 taiko_snd_soc_jack_report(priv,
5627 priv->mbhc_cfg.button_jack,
5628 priv->buttons_pressed,
5629 priv->buttons_pressed);
5630 taiko_snd_soc_jack_report(priv,
5631 priv->mbhc_cfg.button_jack, 0,
5632 priv->buttons_pressed);
5633 }
5634 }
5635 }
5636
5637 priv->buttons_pressed &= ~TAIKO_JACK_BUTTON_MASK;
5638 }
5639
5640 taiko_codec_calibrate_hs_polling(codec);
5641
5642 if (priv->mbhc_cfg.gpio)
5643 msleep(TAIKO_MBHC_GPIO_REL_DEBOUNCE_TIME_MS);
5644
5645 taiko_codec_start_hs_polling(codec);
5646
5647 pr_debug("%s: leave\n", __func__);
5648 TAIKO_RELEASE_LOCK(priv->codec_resource_lock);
5649 return IRQ_HANDLED;
5650}
5651
5652static void taiko_codec_shutdown_hs_removal_detect(struct snd_soc_codec *codec)
5653{
5654 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
5655 const struct taiko_mbhc_general_cfg *generic =
5656 TAIKO_MBHC_CAL_GENERAL_PTR(taiko->mbhc_cfg.calibration);
5657
5658 if (!taiko->mclk_enabled && !taiko->mbhc_polling_active)
5659 taiko_codec_enable_config_mode(codec, 1);
5660
5661 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0x2, 0x2);
5662 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_B1_CTL, 0x6, 0x0);
5663
5664 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.mbhc_reg, 0x80, 0x00);
5665
5666 usleep_range(generic->t_shutdown_plug_rem,
5667 generic->t_shutdown_plug_rem);
5668
5669 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL, 0xA, 0x8);
5670 if (!taiko->mclk_enabled && !taiko->mbhc_polling_active)
5671 taiko_codec_enable_config_mode(codec, 0);
5672
5673 snd_soc_write(codec, TAIKO_A_MBHC_SCALING_MUX_1, 0x00);
5674}
5675
5676static void taiko_codec_cleanup_hs_polling(struct snd_soc_codec *codec)
5677{
5678 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
5679
5680 taiko_codec_shutdown_hs_removal_detect(codec);
5681
5682 if (!taiko->mclk_enabled) {
5683 taiko_codec_disable_clock_block(codec);
5684 taiko_codec_enable_bandgap(codec, TAIKO_BANDGAP_OFF);
5685 }
5686
5687 taiko->mbhc_polling_active = false;
5688 taiko->mbhc_state = MBHC_STATE_NONE;
5689}
5690
5691static irqreturn_t taiko_hphl_ocp_irq(int irq, void *data)
5692{
5693 struct taiko_priv *taiko = data;
5694 struct snd_soc_codec *codec;
5695
5696 pr_info("%s: received HPHL OCP irq\n", __func__);
5697
5698 if (taiko) {
5699 codec = taiko->codec;
5700 if (taiko->hphlocp_cnt++ < TAIKO_OCP_ATTEMPT) {
5701 pr_info("%s: retry\n", __func__);
5702 snd_soc_update_bits(codec, TAIKO_A_RX_HPH_OCP_CTL, 0x10,
5703 0x00);
5704 snd_soc_update_bits(codec, TAIKO_A_RX_HPH_OCP_CTL, 0x10,
5705 0x10);
5706 } else {
5707 wcd9xxx_disable_irq(codec->control_data,
5708 TAIKO_IRQ_HPH_PA_OCPL_FAULT);
5709 taiko->hphlocp_cnt = 0;
5710 taiko->hph_status |= SND_JACK_OC_HPHL;
5711 if (taiko->mbhc_cfg.headset_jack)
5712 taiko_snd_soc_jack_report(taiko,
5713 taiko->mbhc_cfg.headset_jack,
5714 taiko->hph_status,
5715 TAIKO_JACK_MASK);
5716 }
5717 } else {
5718 pr_err("%s: Bad taiko private data\n", __func__);
5719 }
5720
5721 return IRQ_HANDLED;
5722}
5723
5724static irqreturn_t taiko_hphr_ocp_irq(int irq, void *data)
5725{
5726 struct taiko_priv *taiko = data;
5727 struct snd_soc_codec *codec;
5728
5729 pr_info("%s: received HPHR OCP irq\n", __func__);
5730
5731 if (taiko) {
5732 codec = taiko->codec;
5733 if (taiko->hphrocp_cnt++ < TAIKO_OCP_ATTEMPT) {
5734 pr_info("%s: retry\n", __func__);
5735 snd_soc_update_bits(codec, TAIKO_A_RX_HPH_OCP_CTL, 0x10,
5736 0x00);
5737 snd_soc_update_bits(codec, TAIKO_A_RX_HPH_OCP_CTL, 0x10,
5738 0x10);
5739 } else {
5740 wcd9xxx_disable_irq(codec->control_data,
5741 TAIKO_IRQ_HPH_PA_OCPR_FAULT);
5742 taiko->hphrocp_cnt = 0;
5743 taiko->hph_status |= SND_JACK_OC_HPHR;
5744 if (taiko->mbhc_cfg.headset_jack)
5745 taiko_snd_soc_jack_report(taiko,
5746 taiko->mbhc_cfg.headset_jack,
5747 taiko->hph_status,
5748 TAIKO_JACK_MASK);
5749 }
5750 } else {
5751 pr_err("%s: Bad taiko private data\n", __func__);
5752 }
5753
5754 return IRQ_HANDLED;
5755}
5756
5757static bool taiko_is_inval_ins_range(struct snd_soc_codec *codec,
5758 s32 mic_volt, bool highhph, bool *highv)
5759{
5760 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
5761 bool invalid = false;
5762 s16 v_hs_max;
5763
5764 /* Perform this check only when the high voltage headphone
5765 * needs to be considered as invalid
5766 */
5767 v_hs_max = taiko_get_current_v_hs_max(taiko);
5768 *highv = mic_volt > v_hs_max;
5769 if (!highhph && *highv)
5770 invalid = true;
5771 else if (mic_volt < taiko->mbhc_data.v_inval_ins_high &&
5772 (mic_volt > taiko->mbhc_data.v_inval_ins_low))
5773 invalid = true;
5774
5775 return invalid;
5776}
5777
5778static bool taiko_is_inval_ins_delta(struct snd_soc_codec *codec,
5779 int mic_volt, int mic_volt_prev,
5780 int threshold)
5781{
5782 return abs(mic_volt - mic_volt_prev) > threshold;
5783}
5784
5785/* called under codec_resource_lock acquisition */
5786void taiko_find_plug_and_report(struct snd_soc_codec *codec,
5787 enum taiko_mbhc_plug_type plug_type)
5788{
5789 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
5790
5791 if (plug_type == PLUG_TYPE_HEADPHONE &&
5792 taiko->current_plug == PLUG_TYPE_NONE) {
5793 /* Nothing was reported previously
5794 * report a headphone or unsupported
5795 */
5796 taiko_codec_report_plug(codec, 1, SND_JACK_HEADPHONE);
5797 taiko_codec_cleanup_hs_polling(codec);
5798 } else if (plug_type == PLUG_TYPE_GND_MIC_SWAP) {
5799 if (taiko->current_plug == PLUG_TYPE_HEADSET)
5800 taiko_codec_report_plug(codec, 0, SND_JACK_HEADSET);
5801 else if (taiko->current_plug == PLUG_TYPE_HEADPHONE)
5802 taiko_codec_report_plug(codec, 0, SND_JACK_HEADPHONE);
5803
5804 taiko_codec_report_plug(codec, 1, SND_JACK_UNSUPPORTED);
5805 taiko_codec_cleanup_hs_polling(codec);
5806 } else if (plug_type == PLUG_TYPE_HEADSET) {
5807 /* If Headphone was reported previously, this will
5808 * only report the mic line
5809 */
5810 taiko_codec_report_plug(codec, 1, SND_JACK_HEADSET);
5811 msleep(100);
5812 taiko_codec_start_hs_polling(codec);
5813 } else if (plug_type == PLUG_TYPE_HIGH_HPH) {
5814 if (taiko->current_plug == PLUG_TYPE_NONE)
5815 taiko_codec_report_plug(codec, 1, SND_JACK_HEADPHONE);
5816 taiko_codec_cleanup_hs_polling(codec);
5817 pr_debug("setup mic trigger for further detection\n");
5818 taiko->lpi_enabled = true;
5819 taiko_codec_enable_hs_detect(codec, 1,
5820 MBHC_USE_MB_TRIGGER |
5821 MBHC_USE_HPHL_TRIGGER,
5822 false);
5823 } else {
5824 WARN(1, "Unexpected current plug_type %d, plug_type %d\n",
5825 taiko->current_plug, plug_type);
5826 }
5827}
5828
5829/* should be called under interrupt context that hold suspend */
5830static void taiko_schedule_hs_detect_plug(struct taiko_priv *taiko)
5831{
5832 pr_debug("%s: scheduling taiko_hs_correct_gpio_plug\n", __func__);
5833 taiko->hs_detect_work_stop = false;
5834 wcd9xxx_lock_sleep(taiko->codec->control_data);
5835 schedule_work(&taiko->hs_correct_plug_work);
5836}
5837
5838/* called under codec_resource_lock acquisition */
5839static void taiko_cancel_hs_detect_plug(struct taiko_priv *taiko)
5840{
5841 pr_debug("%s: canceling hs_correct_plug_work\n", __func__);
5842 taiko->hs_detect_work_stop = true;
5843 wmb();
5844 TAIKO_RELEASE_LOCK(taiko->codec_resource_lock);
5845 if (cancel_work_sync(&taiko->hs_correct_plug_work)) {
5846 pr_debug("%s: hs_correct_plug_work is canceled\n", __func__);
5847 wcd9xxx_unlock_sleep(taiko->codec->control_data);
5848 }
5849 TAIKO_ACQUIRE_LOCK(taiko->codec_resource_lock);
5850}
5851
5852static bool taiko_hs_gpio_level_remove(struct taiko_priv *taiko)
5853{
5854 return (gpio_get_value_cansleep(taiko->mbhc_cfg.gpio) !=
5855 taiko->mbhc_cfg.gpio_level_insert);
5856}
5857
5858/* called under codec_resource_lock acquisition */
5859static void taiko_codec_hphr_gnd_switch(struct snd_soc_codec *codec, bool on)
5860{
5861 snd_soc_update_bits(codec, TAIKO_A_MBHC_HPH, 0x01, on);
5862 if (on)
5863 usleep_range(5000, 5000);
5864}
5865
5866/* called under codec_resource_lock acquisition and mbhc override = 1 */
5867static enum taiko_mbhc_plug_type
5868taiko_codec_get_plug_type(struct snd_soc_codec *codec, bool highhph)
5869{
5870 int i;
5871 bool gndswitch, vddioswitch;
5872 int scaled;
5873 struct taiko_mbhc_plug_type_cfg *plug_type_ptr;
5874 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
5875 const bool vddio = (taiko->mbhc_data.micb_mv != VDDIO_MICBIAS_MV);
5876 int num_det = (MBHC_NUM_DCE_PLUG_DETECT + vddio);
5877 enum taiko_mbhc_plug_type plug_type[num_det];
5878 s16 mb_v[num_det];
5879 s32 mic_mv[num_det];
5880 bool inval;
5881 bool highdelta;
5882 bool ahighv = false, highv;
5883
5884 /* make sure override is on */
5885 WARN_ON(!(snd_soc_read(codec, TAIKO_A_CDC_MBHC_B1_CTL) & 0x04));
5886
5887 /* GND and MIC swap detection requires at least 2 rounds of DCE */
5888 BUG_ON(num_det < 2);
5889
5890 plug_type_ptr =
5891 TAIKO_MBHC_CAL_PLUG_TYPE_PTR(taiko->mbhc_cfg.calibration);
5892
5893 plug_type[0] = PLUG_TYPE_INVALID;
5894
5895 /* performs DCEs for N times
5896 * 1st: check if voltage is in invalid range
5897 * 2nd - N-2nd: check voltage range and delta
5898 * N-1st: check voltage range, delta with HPHR GND switch
5899 * Nth: check voltage range with VDDIO switch if micbias V != vddio V*/
5900 for (i = 0; i < num_det; i++) {
5901 gndswitch = (i == (num_det - 1 - vddio));
5902 vddioswitch = (vddio && ((i == num_det - 1) ||
5903 (i == num_det - 2)));
5904 if (i == 0) {
5905 mb_v[i] = taiko_codec_setup_hs_polling(codec);
5906 mic_mv[i] = taiko_codec_sta_dce_v(codec, 1 , mb_v[i]);
5907 inval = taiko_is_inval_ins_range(codec, mic_mv[i],
5908 highhph, &highv);
5909 ahighv |= highv;
5910 scaled = mic_mv[i];
5911 } else {
5912 if (vddioswitch)
5913 __taiko_codec_switch_micbias(taiko->codec, 1,
5914 false, false);
5915 if (gndswitch)
5916 taiko_codec_hphr_gnd_switch(codec, true);
5917 mb_v[i] = __taiko_codec_sta_dce(codec, 1, true, true);
5918 mic_mv[i] = taiko_codec_sta_dce_v(codec, 1 , mb_v[i]);
5919 if (vddioswitch)
5920 scaled = taiko_scale_v_micb_vddio(taiko,
5921 mic_mv[i],
5922 false);
5923 else
5924 scaled = mic_mv[i];
5925 /* !gndswitch & vddioswitch means the previous DCE
5926 * was done with gndswitch, don't compare with DCE
5927 * with gndswitch */
5928 highdelta = taiko_is_inval_ins_delta(codec, scaled,
5929 mic_mv[i - !gndswitch - vddioswitch],
5930 TAIKO_MBHC_FAKE_INS_DELTA_SCALED_MV);
5931 inval = (taiko_is_inval_ins_range(codec, mic_mv[i],
5932 highhph, &highv) ||
5933 highdelta);
5934 ahighv |= highv;
5935 if (gndswitch)
5936 taiko_codec_hphr_gnd_switch(codec, false);
5937 if (vddioswitch)
5938 __taiko_codec_switch_micbias(taiko->codec, 0,
5939 false, false);
5940 /* claim UNSUPPORTED plug insertion when
5941 * good headset is detected but HPHR GND switch makes
5942 * delta difference */
5943 if (i == (num_det - 2) && highdelta && !ahighv)
5944 plug_type[0] = PLUG_TYPE_GND_MIC_SWAP;
5945 else if (i == (num_det - 1) && inval)
5946 plug_type[0] = PLUG_TYPE_INVALID;
5947 }
5948 pr_debug("%s: DCE #%d, %04x, V %d, scaled V %d, GND %d, VDDIO %d, inval %d\n",
5949 __func__, i + 1, mb_v[i] & 0xffff, mic_mv[i], scaled,
5950 gndswitch, vddioswitch, inval);
5951 /* don't need to run further DCEs */
5952 if (ahighv && inval)
5953 break;
5954 mic_mv[i] = scaled;
5955 }
5956
5957 for (i = 0; (plug_type[0] != PLUG_TYPE_GND_MIC_SWAP && !inval) &&
5958 i < num_det; i++) {
5959 /*
5960 * If we are here, means none of the all
5961 * measurements are fake, continue plug type detection.
5962 * If all three measurements do not produce same
5963 * plug type, restart insertion detection
5964 */
5965 if (mic_mv[i] < plug_type_ptr->v_no_mic) {
5966 plug_type[i] = PLUG_TYPE_HEADPHONE;
5967 pr_debug("%s: Detect attempt %d, detected Headphone\n",
5968 __func__, i);
5969 } else if (highhph && (mic_mv[i] > plug_type_ptr->v_hs_max)) {
5970 plug_type[i] = PLUG_TYPE_HIGH_HPH;
5971 pr_debug(
5972 "%s: Detect attempt %d, detected High Headphone\n",
5973 __func__, i);
5974 } else {
5975 plug_type[i] = PLUG_TYPE_HEADSET;
5976 pr_debug("%s: Detect attempt %d, detected Headset\n",
5977 __func__, i);
5978 }
5979
5980 if (i > 0 && (plug_type[i - 1] != plug_type[i])) {
5981 pr_err("%s: Detect attempt %d and %d are not same",
5982 __func__, i - 1, i);
5983 plug_type[0] = PLUG_TYPE_INVALID;
5984 inval = true;
5985 break;
5986 }
5987 }
5988
5989 pr_debug("%s: Detected plug type %d\n", __func__, plug_type[0]);
5990 return plug_type[0];
5991}
5992
5993static void taiko_hs_correct_gpio_plug(struct work_struct *work)
5994{
5995 struct taiko_priv *taiko;
5996 struct snd_soc_codec *codec;
5997 int retry = 0, pt_gnd_mic_swap_cnt = 0;
5998 bool correction = false;
5999 enum taiko_mbhc_plug_type plug_type;
6000 unsigned long timeout;
6001
6002 taiko = container_of(work, struct taiko_priv, hs_correct_plug_work);
6003 codec = taiko->codec;
6004
6005 pr_debug("%s: enter\n", __func__);
6006 taiko->mbhc_cfg.mclk_cb_fn(codec, 1, false);
6007
6008 /* Keep override on during entire plug type correction work.
6009 *
6010 * This is okay under the assumption that any GPIO irqs which use
6011 * MBHC block cancel and sync this work so override is off again
6012 * prior to GPIO interrupt handler's MBHC block usage.
6013 * Also while this correction work is running, we can guarantee
6014 * DAPM doesn't use any MBHC block as this work only runs with
6015 * headphone detection.
6016 */
6017 taiko_turn_onoff_override(codec, true);
6018
6019 timeout = jiffies + msecs_to_jiffies(TAIKO_HS_DETECT_PLUG_TIME_MS);
6020 while (!time_after(jiffies, timeout)) {
6021 ++retry;
6022 rmb();
6023 if (taiko->hs_detect_work_stop) {
6024 pr_debug("%s: stop requested\n", __func__);
6025 break;
6026 }
6027
6028 msleep(TAIKO_HS_DETECT_PLUG_INERVAL_MS);
6029 if (taiko_hs_gpio_level_remove(taiko)) {
6030 pr_debug("%s: GPIO value is low\n", __func__);
6031 break;
6032 }
6033
6034 /* can race with removal interrupt */
6035 TAIKO_ACQUIRE_LOCK(taiko->codec_resource_lock);
6036 plug_type = taiko_codec_get_plug_type(codec, true);
6037 TAIKO_RELEASE_LOCK(taiko->codec_resource_lock);
6038
6039 if (plug_type == PLUG_TYPE_INVALID) {
6040 pr_debug("Invalid plug in attempt # %d\n", retry);
6041 if (retry == NUM_ATTEMPTS_TO_REPORT &&
6042 taiko->current_plug == PLUG_TYPE_NONE) {
6043 taiko_codec_report_plug(codec, 1,
6044 SND_JACK_HEADPHONE);
6045 }
6046 } else if (plug_type == PLUG_TYPE_HEADPHONE) {
6047 pr_debug("Good headphone detected, continue polling mic\n");
6048 if (taiko->current_plug == PLUG_TYPE_NONE)
6049 taiko_codec_report_plug(codec, 1,
6050 SND_JACK_HEADPHONE);
6051 } else {
6052 if (plug_type == PLUG_TYPE_GND_MIC_SWAP) {
6053 pt_gnd_mic_swap_cnt++;
6054 if (pt_gnd_mic_swap_cnt <
6055 TAIKO_MBHC_GND_MIC_SWAP_THRESHOLD)
6056 continue;
6057 else if (pt_gnd_mic_swap_cnt >
6058 TAIKO_MBHC_GND_MIC_SWAP_THRESHOLD) {
6059 /* This is due to GND/MIC switch didn't
6060 * work, Report unsupported plug */
6061 } else if (taiko->mbhc_cfg.swap_gnd_mic) {
6062 /* if switch is toggled, check again,
6063 * otherwise report unsupported plug */
6064 if (taiko->mbhc_cfg.swap_gnd_mic(codec))
6065 continue;
6066 }
6067 } else
6068 pt_gnd_mic_swap_cnt = 0;
6069
6070 TAIKO_ACQUIRE_LOCK(taiko->codec_resource_lock);
6071 /* Turn off override */
6072 taiko_turn_onoff_override(codec, false);
6073 /* The valid plug also includes PLUG_TYPE_GND_MIC_SWAP
6074 */
6075 taiko_find_plug_and_report(codec, plug_type);
6076 TAIKO_RELEASE_LOCK(taiko->codec_resource_lock);
6077 pr_debug("Attempt %d found correct plug %d\n", retry,
6078 plug_type);
6079 correction = true;
6080 break;
6081 }
6082 }
6083
6084 /* Turn off override */
6085 if (!correction)
6086 taiko_turn_onoff_override(codec, false);
6087
6088 taiko->mbhc_cfg.mclk_cb_fn(codec, 0, false);
6089 pr_debug("%s: leave\n", __func__);
6090 /* unlock sleep */
6091 wcd9xxx_unlock_sleep(taiko->codec->control_data);
6092}
6093
6094/* called under codec_resource_lock acquisition */
6095static void taiko_codec_decide_gpio_plug(struct snd_soc_codec *codec)
6096{
6097 enum taiko_mbhc_plug_type plug_type;
6098 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
6099
6100 pr_debug("%s: enter\n", __func__);
6101
6102 taiko_turn_onoff_override(codec, true);
6103 plug_type = taiko_codec_get_plug_type(codec, true);
6104 taiko_turn_onoff_override(codec, false);
6105
6106 if (taiko_hs_gpio_level_remove(taiko)) {
6107 pr_debug("%s: GPIO value is low when determining plug\n",
6108 __func__);
6109 return;
6110 }
6111
6112 if (plug_type == PLUG_TYPE_INVALID ||
6113 plug_type == PLUG_TYPE_GND_MIC_SWAP) {
6114 taiko_schedule_hs_detect_plug(taiko);
6115 } else if (plug_type == PLUG_TYPE_HEADPHONE) {
6116 taiko_codec_report_plug(codec, 1, SND_JACK_HEADPHONE);
6117
6118 taiko_schedule_hs_detect_plug(taiko);
6119 } else {
6120 pr_debug("%s: Valid plug found, determine plug type %d\n",
6121 __func__, plug_type);
6122 taiko_find_plug_and_report(codec, plug_type);
6123 }
6124}
6125
6126/* called under codec_resource_lock acquisition */
6127static void taiko_codec_detect_plug_type(struct snd_soc_codec *codec)
6128{
6129 enum taiko_mbhc_plug_type plug_type;
6130 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
6131 const struct taiko_mbhc_plug_detect_cfg *plug_det =
6132 TAIKO_MBHC_CAL_PLUG_DET_PTR(taiko->mbhc_cfg.calibration);
6133
6134 /* Turn on the override,
6135 * taiko_codec_setup_hs_polling requires override on */
6136 taiko_turn_onoff_override(codec, true);
6137
6138 if (plug_det->t_ins_complete > 20)
6139 msleep(plug_det->t_ins_complete);
6140 else
6141 usleep_range(plug_det->t_ins_complete * 1000,
6142 plug_det->t_ins_complete * 1000);
6143
6144 if (taiko->mbhc_cfg.gpio) {
6145 /* Turn off the override */
6146 taiko_turn_onoff_override(codec, false);
6147 if (taiko_hs_gpio_level_remove(taiko))
6148 pr_debug(
6149 "%s: GPIO value is low when determining plug\n",
6150 __func__);
6151 else
6152 taiko_codec_decide_gpio_plug(codec);
6153 return;
6154 }
6155
6156 plug_type = taiko_codec_get_plug_type(codec, false);
6157 taiko_turn_onoff_override(codec, false);
6158
6159 if (plug_type == PLUG_TYPE_INVALID) {
6160 pr_debug("%s: Invalid plug type detected\n", __func__);
6161 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_B1_CTL, 0x02, 0x02);
6162 taiko_codec_cleanup_hs_polling(codec);
6163 taiko_codec_enable_hs_detect(codec, 1,
6164 MBHC_USE_MB_TRIGGER |
6165 MBHC_USE_HPHL_TRIGGER, false);
6166 } else if (plug_type == PLUG_TYPE_GND_MIC_SWAP) {
6167 pr_debug("%s: GND-MIC swapped plug type detected\n", __func__);
6168 taiko_codec_report_plug(codec, 1, SND_JACK_UNSUPPORTED);
6169 taiko_codec_cleanup_hs_polling(codec);
6170 taiko_codec_enable_hs_detect(codec, 0, 0, false);
6171 } else if (plug_type == PLUG_TYPE_HEADPHONE) {
6172 pr_debug("%s: Headphone Detected\n", __func__);
6173 taiko_codec_report_plug(codec, 1, SND_JACK_HEADPHONE);
6174 taiko_codec_cleanup_hs_polling(codec);
6175 taiko_codec_enable_hs_detect(codec, 0, 0, false);
6176 } else if (plug_type == PLUG_TYPE_HEADSET) {
6177 pr_debug("%s: Headset detected\n", __func__);
6178 taiko_codec_report_plug(codec, 1, SND_JACK_HEADSET);
6179
6180 /* avoid false button press detect */
6181 msleep(50);
6182 taiko_codec_start_hs_polling(codec);
6183 }
6184}
6185
6186/* called only from interrupt which is under codec_resource_lock acquisition */
6187static void taiko_hs_insert_irq_gpio(struct taiko_priv *priv, bool is_removal)
6188{
6189 struct snd_soc_codec *codec = priv->codec;
6190
6191 if (!is_removal) {
6192 pr_debug("%s: MIC trigger insertion interrupt\n", __func__);
6193
6194 rmb();
6195 if (priv->lpi_enabled)
6196 msleep(100);
6197
6198 rmb();
6199 if (!priv->lpi_enabled) {
6200 pr_debug("%s: lpi is disabled\n", __func__);
6201 } else if (gpio_get_value_cansleep(priv->mbhc_cfg.gpio) ==
6202 priv->mbhc_cfg.gpio_level_insert) {
6203 pr_debug(
6204 "%s: Valid insertion, detect plug type\n", __func__);
6205 taiko_codec_decide_gpio_plug(codec);
6206 } else {
6207 pr_debug(
6208 "%s: Invalid insertion stop plug detection\n",
6209 __func__);
6210 }
6211 } else {
6212 pr_err("%s: GPIO used, invalid MBHC Removal\n", __func__);
6213 }
6214}
6215
6216/* called only from interrupt which is under codec_resource_lock acquisition */
6217static void taiko_hs_insert_irq_nogpio(struct taiko_priv *priv, bool is_removal,
6218 bool is_mb_trigger)
6219{
6220 int ret;
6221 struct snd_soc_codec *codec = priv->codec;
6222 struct wcd9xxx *core = dev_get_drvdata(priv->codec->dev->parent);
6223
6224 if (is_removal) {
6225 /* cancel possiblely running hs detect work */
6226 taiko_cancel_hs_detect_plug(priv);
6227
6228 /*
6229 * If headphone is removed while playback is in progress,
6230 * it is possible that micbias will be switched to VDDIO.
6231 */
6232 taiko_codec_switch_micbias(codec, 0);
6233 if (priv->current_plug == PLUG_TYPE_HEADPHONE)
6234 taiko_codec_report_plug(codec, 0, SND_JACK_HEADPHONE);
6235 else if (priv->current_plug == PLUG_TYPE_GND_MIC_SWAP)
6236 taiko_codec_report_plug(codec, 0, SND_JACK_UNSUPPORTED);
6237 else
6238 WARN(1, "%s: Unexpected current plug type %d\n",
6239 __func__, priv->current_plug);
6240 taiko_codec_shutdown_hs_removal_detect(codec);
6241 taiko_codec_enable_hs_detect(codec, 1,
6242 MBHC_USE_MB_TRIGGER |
6243 MBHC_USE_HPHL_TRIGGER,
6244 true);
6245 } else if (is_mb_trigger && !is_removal) {
6246 pr_debug("%s: Waiting for Headphone left trigger\n",
6247 __func__);
6248 wcd9xxx_lock_sleep(core);
6249 if (schedule_delayed_work(&priv->mbhc_insert_dwork,
6250 usecs_to_jiffies(1000000)) == 0) {
6251 pr_err("%s: mbhc_insert_dwork is already scheduled\n",
6252 __func__);
6253 wcd9xxx_unlock_sleep(core);
6254 }
6255 taiko_codec_enable_hs_detect(codec, 1, MBHC_USE_HPHL_TRIGGER,
6256 false);
6257 } else {
6258 ret = cancel_delayed_work(&priv->mbhc_insert_dwork);
6259 if (ret != 0) {
6260 pr_debug(
6261 "%s: Complete plug insertion, Detecting plug type\n",
6262 __func__);
6263 taiko_codec_detect_plug_type(codec);
6264 wcd9xxx_unlock_sleep(core);
6265 } else {
6266 wcd9xxx_enable_irq(codec->control_data,
6267 TAIKO_IRQ_MBHC_INSERTION);
6268 pr_err("%s: Error detecting plug insertion\n",
6269 __func__);
6270 }
6271 }
6272}
6273
6274static irqreturn_t taiko_hs_insert_irq(int irq, void *data)
6275{
6276 bool is_mb_trigger, is_removal;
6277 struct taiko_priv *priv = data;
6278 struct snd_soc_codec *codec = priv->codec;
6279
6280 pr_debug("%s: enter\n", __func__);
6281 TAIKO_ACQUIRE_LOCK(priv->codec_resource_lock);
6282 wcd9xxx_disable_irq(codec->control_data, TAIKO_IRQ_MBHC_INSERTION);
6283
6284 is_mb_trigger = !!(snd_soc_read(codec, priv->mbhc_bias_regs.mbhc_reg) &
6285 0x10);
6286 is_removal = !!(snd_soc_read(codec, TAIKO_A_CDC_MBHC_INT_CTL) & 0x02);
6287 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_INT_CTL, 0x03, 0x00);
6288
6289 /* Turn off both HPH and MIC line schmitt triggers */
6290 snd_soc_update_bits(codec, priv->mbhc_bias_regs.mbhc_reg, 0x90, 0x00);
6291 snd_soc_update_bits(codec, TAIKO_A_MBHC_HPH, 0x13, 0x00);
6292 snd_soc_update_bits(codec, priv->mbhc_bias_regs.ctl_reg, 0x01, 0x00);
6293
6294 if (priv->mbhc_cfg.gpio)
6295 taiko_hs_insert_irq_gpio(priv, is_removal);
6296 else
6297 taiko_hs_insert_irq_nogpio(priv, is_removal, is_mb_trigger);
6298
6299 TAIKO_RELEASE_LOCK(priv->codec_resource_lock);
6300 return IRQ_HANDLED;
6301}
6302
6303static bool is_valid_mic_voltage(struct snd_soc_codec *codec, s32 mic_mv)
6304{
6305 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
6306 const struct taiko_mbhc_plug_type_cfg *plug_type =
6307 TAIKO_MBHC_CAL_PLUG_TYPE_PTR(taiko->mbhc_cfg.calibration);
6308 const s16 v_hs_max = taiko_get_current_v_hs_max(taiko);
6309
6310 return (!(mic_mv > 10 && mic_mv < 80) && (mic_mv > plug_type->v_no_mic)
6311 && (mic_mv < v_hs_max)) ? true : false;
6312}
6313
6314/* called under codec_resource_lock acquisition
6315 * returns true if mic voltage range is back to normal insertion
6316 * returns false either if timedout or removed */
6317static bool taiko_hs_remove_settle(struct snd_soc_codec *codec)
6318{
6319 int i;
6320 bool timedout, settled = false;
6321 s32 mic_mv[MBHC_NUM_DCE_PLUG_DETECT];
6322 short mb_v[MBHC_NUM_DCE_PLUG_DETECT];
6323 unsigned long retry = 0, timeout;
6324 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
6325 const s16 v_hs_max = taiko_get_current_v_hs_max(taiko);
6326
6327 timeout = jiffies + msecs_to_jiffies(TAIKO_HS_DETECT_PLUG_TIME_MS);
6328 while (!(timedout = time_after(jiffies, timeout))) {
6329 retry++;
6330 if (taiko->mbhc_cfg.gpio && taiko_hs_gpio_level_remove(taiko)) {
6331 pr_debug("%s: GPIO indicates removal\n", __func__);
6332 break;
6333 }
6334
6335 if (taiko->mbhc_cfg.gpio) {
6336 if (retry > 1)
6337 msleep(250);
6338 else
6339 msleep(50);
6340 }
6341
6342 if (taiko->mbhc_cfg.gpio && taiko_hs_gpio_level_remove(taiko)) {
6343 pr_debug("%s: GPIO indicates removal\n", __func__);
6344 break;
6345 }
6346
6347 for (i = 0; i < MBHC_NUM_DCE_PLUG_DETECT; i++) {
6348 mb_v[i] = taiko_codec_sta_dce(codec, 1, true);
6349 mic_mv[i] = taiko_codec_sta_dce_v(codec, 1 , mb_v[i]);
6350 pr_debug("%s : DCE run %lu, mic_mv = %d(%x)\n",
6351 __func__, retry, mic_mv[i], mb_v[i]);
6352 }
6353
6354 if (taiko->mbhc_cfg.gpio && taiko_hs_gpio_level_remove(taiko)) {
6355 pr_debug("%s: GPIO indicates removal\n", __func__);
6356 break;
6357 }
6358
6359 if (taiko->current_plug == PLUG_TYPE_NONE) {
6360 pr_debug("%s : headset/headphone is removed\n",
6361 __func__);
6362 break;
6363 }
6364
6365 for (i = 0; i < MBHC_NUM_DCE_PLUG_DETECT; i++)
6366 if (!is_valid_mic_voltage(codec, mic_mv[i]))
6367 break;
6368
6369 if (i == MBHC_NUM_DCE_PLUG_DETECT) {
6370 pr_debug("%s: MIC voltage settled\n", __func__);
6371 settled = true;
6372 msleep(200);
6373 break;
6374 }
6375
6376 /* only for non-GPIO remove irq */
6377 if (!taiko->mbhc_cfg.gpio) {
6378 for (i = 0; i < MBHC_NUM_DCE_PLUG_DETECT; i++)
6379 if (mic_mv[i] < v_hs_max)
6380 break;
6381 if (i == MBHC_NUM_DCE_PLUG_DETECT) {
6382 pr_debug("%s: Headset is removed\n", __func__);
6383 break;
6384 }
6385 }
6386 }
6387
6388 if (timedout)
6389 pr_debug("%s: Microphone did not settle in %d seconds\n",
6390 __func__, TAIKO_HS_DETECT_PLUG_TIME_MS);
6391 return settled;
6392}
6393
6394/* called only from interrupt which is under codec_resource_lock acquisition */
6395static void taiko_hs_remove_irq_gpio(struct taiko_priv *priv)
6396{
6397 struct snd_soc_codec *codec = priv->codec;
6398
6399 if (taiko_hs_remove_settle(codec))
6400 taiko_codec_start_hs_polling(codec);
6401 pr_debug("%s: remove settle done\n", __func__);
6402}
6403
6404/* called only from interrupt which is under codec_resource_lock acquisition */
6405static void taiko_hs_remove_irq_nogpio(struct taiko_priv *priv)
6406{
6407 short bias_value;
6408 bool removed = true;
6409 struct snd_soc_codec *codec = priv->codec;
6410 const struct taiko_mbhc_general_cfg *generic =
6411 TAIKO_MBHC_CAL_GENERAL_PTR(priv->mbhc_cfg.calibration);
6412 int min_us = TAIKO_FAKE_REMOVAL_MIN_PERIOD_MS * 1000;
6413
6414 if (priv->current_plug != PLUG_TYPE_HEADSET) {
6415 pr_debug("%s(): Headset is not inserted, ignore removal\n",
6416 __func__);
6417 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL,
6418 0x08, 0x08);
6419 return;
6420 }
6421
6422 usleep_range(generic->t_shutdown_plug_rem,
6423 generic->t_shutdown_plug_rem);
6424
6425 do {
6426 bias_value = taiko_codec_sta_dce(codec, 1, true);
6427 pr_debug("%s: DCE %d,%d, %d us left\n", __func__, bias_value,
6428 taiko_codec_sta_dce_v(codec, 1, bias_value), min_us);
6429 if (bias_value < taiko_get_current_v_ins(priv, false)) {
6430 pr_debug("%s: checking false removal\n", __func__);
6431 msleep(500);
6432 removed = !taiko_hs_remove_settle(codec);
6433 pr_debug("%s: headset %sactually removed\n", __func__,
6434 removed ? "" : "not ");
6435 break;
6436 }
6437 min_us -= priv->mbhc_data.t_dce;
6438 } while (min_us > 0);
6439
6440 if (removed) {
6441 /* cancel possiblely running hs detect work */
6442 taiko_cancel_hs_detect_plug(priv);
6443 /*
6444 * If this removal is not false, first check the micbias
6445 * switch status and switch it to LDOH if it is already
6446 * switched to VDDIO.
6447 */
6448 taiko_codec_switch_micbias(codec, 0);
6449
6450 taiko_codec_report_plug(codec, 0, SND_JACK_HEADSET);
6451 taiko_codec_cleanup_hs_polling(codec);
6452 taiko_codec_enable_hs_detect(codec, 1,
6453 MBHC_USE_MB_TRIGGER |
6454 MBHC_USE_HPHL_TRIGGER,
6455 true);
6456 } else {
6457 taiko_codec_start_hs_polling(codec);
6458 }
6459}
6460
6461static irqreturn_t taiko_hs_remove_irq(int irq, void *data)
6462{
6463 struct taiko_priv *priv = data;
6464 bool vddio;
6465 pr_debug("%s: enter, removal interrupt\n", __func__);
6466
6467 TAIKO_ACQUIRE_LOCK(priv->codec_resource_lock);
6468 vddio = (priv->mbhc_data.micb_mv != VDDIO_MICBIAS_MV &&
6469 priv->mbhc_micbias_switched);
6470 if (vddio)
6471 __taiko_codec_switch_micbias(priv->codec, 0, false, true);
6472
6473 if (priv->mbhc_cfg.gpio)
6474 taiko_hs_remove_irq_gpio(priv);
6475 else
6476 taiko_hs_remove_irq_nogpio(priv);
6477
6478 /* if driver turned off vddio switch and headset is not removed,
6479 * turn on the vddio switch back, if headset is removed then vddio
6480 * switch is off by time now and shouldn't be turn on again from here */
6481 if (vddio && priv->current_plug == PLUG_TYPE_HEADSET)
6482 __taiko_codec_switch_micbias(priv->codec, 1, true, true);
6483 TAIKO_RELEASE_LOCK(priv->codec_resource_lock);
6484
6485 return IRQ_HANDLED;
6486}
6487
6488static void taiko_mbhc_insert_work(struct work_struct *work)
6489{
6490 struct delayed_work *dwork;
6491 struct taiko_priv *taiko;
6492 struct snd_soc_codec *codec;
6493 struct wcd9xxx *taiko_core;
6494
6495 dwork = to_delayed_work(work);
6496 taiko = container_of(dwork, struct taiko_priv, mbhc_insert_dwork);
6497 codec = taiko->codec;
6498 taiko_core = dev_get_drvdata(codec->dev->parent);
6499
6500 pr_debug("%s:\n", __func__);
6501
6502 /* Turn off both HPH and MIC line schmitt triggers */
6503 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.mbhc_reg, 0x90, 0x00);
6504 snd_soc_update_bits(codec, TAIKO_A_MBHC_HPH, 0x13, 0x00);
6505 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.ctl_reg, 0x01, 0x00);
6506 wcd9xxx_disable_irq_sync(codec->control_data, TAIKO_IRQ_MBHC_INSERTION);
6507 taiko_codec_detect_plug_type(codec);
6508 wcd9xxx_unlock_sleep(taiko_core);
6509}
6510
6511static void taiko_hs_gpio_handler(struct snd_soc_codec *codec)
6512{
6513 bool insert;
6514 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
6515 bool is_removed = false;
6516
6517 pr_debug("%s: enter\n", __func__);
6518
6519 taiko->in_gpio_handler = true;
6520 /* Wait here for debounce time */
6521 usleep_range(TAIKO_GPIO_IRQ_DEBOUNCE_TIME_US,
6522 TAIKO_GPIO_IRQ_DEBOUNCE_TIME_US);
6523
6524 TAIKO_ACQUIRE_LOCK(taiko->codec_resource_lock);
6525
6526 /* cancel pending button press */
6527 if (taiko_cancel_btn_work(taiko))
6528 pr_debug("%s: button press is canceled\n", __func__);
6529
6530 insert = (gpio_get_value_cansleep(taiko->mbhc_cfg.gpio) ==
6531 taiko->mbhc_cfg.gpio_level_insert);
6532 if ((taiko->current_plug == PLUG_TYPE_NONE) && insert) {
6533 taiko->lpi_enabled = false;
6534 wmb();
6535
6536 /* cancel detect plug */
6537 taiko_cancel_hs_detect_plug(taiko);
6538
6539 /* Disable Mic Bias pull down and HPH Switch to GND */
6540 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.ctl_reg, 0x01,
6541 0x00);
6542 snd_soc_update_bits(codec, TAIKO_A_MBHC_HPH, 0x01, 0x00);
6543 taiko_codec_detect_plug_type(codec);
6544 } else if ((taiko->current_plug != PLUG_TYPE_NONE) && !insert) {
6545 taiko->lpi_enabled = false;
6546 wmb();
6547
6548 /* cancel detect plug */
6549 taiko_cancel_hs_detect_plug(taiko);
6550
6551 if (taiko->current_plug == PLUG_TYPE_HEADPHONE) {
6552 taiko_codec_report_plug(codec, 0, SND_JACK_HEADPHONE);
6553 is_removed = true;
6554 } else if (taiko->current_plug == PLUG_TYPE_GND_MIC_SWAP) {
6555 taiko_codec_report_plug(codec, 0, SND_JACK_UNSUPPORTED);
6556 is_removed = true;
6557 } else if (taiko->current_plug == PLUG_TYPE_HEADSET) {
6558 taiko_codec_pause_hs_polling(codec);
6559 taiko_codec_cleanup_hs_polling(codec);
6560 taiko_codec_report_plug(codec, 0, SND_JACK_HEADSET);
6561 is_removed = true;
6562 }
6563
6564 if (is_removed) {
6565 /* Enable Mic Bias pull down and HPH Switch to GND */
6566 snd_soc_update_bits(codec,
6567 taiko->mbhc_bias_regs.ctl_reg, 0x01,
6568 0x01);
6569 snd_soc_update_bits(codec, TAIKO_A_MBHC_HPH, 0x01,
6570 0x01);
6571 /* Make sure mic trigger is turned off */
6572 snd_soc_update_bits(codec,
6573 taiko->mbhc_bias_regs.ctl_reg,
6574 0x01, 0x01);
6575 snd_soc_update_bits(codec,
6576 taiko->mbhc_bias_regs.mbhc_reg,
6577 0x90, 0x00);
6578 /* Reset MBHC State Machine */
6579 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL,
6580 0x08, 0x08);
6581 snd_soc_update_bits(codec, TAIKO_A_CDC_MBHC_CLK_CTL,
6582 0x08, 0x00);
6583 /* Turn off override */
6584 taiko_turn_onoff_override(codec, false);
6585 }
6586 }
6587
6588 taiko->in_gpio_handler = false;
6589 TAIKO_RELEASE_LOCK(taiko->codec_resource_lock);
6590 pr_debug("%s: leave\n", __func__);
6591}
6592
6593static irqreturn_t taiko_mechanical_plug_detect_irq(int irq, void *data)
6594{
6595 int r = IRQ_HANDLED;
6596 struct snd_soc_codec *codec = data;
6597
6598 if (unlikely(wcd9xxx_lock_sleep(codec->control_data) == false)) {
6599 pr_warn("%s: failed to hold suspend\n", __func__);
6600 r = IRQ_NONE;
6601 } else {
6602 taiko_hs_gpio_handler(codec);
6603 wcd9xxx_unlock_sleep(codec->control_data);
6604 }
6605
6606 return r;
6607}
6608
6609static int taiko_mbhc_init_and_calibrate(struct taiko_priv *taiko)
6610{
6611 int ret = 0;
6612 struct snd_soc_codec *codec = taiko->codec;
6613
6614 taiko->mbhc_cfg.mclk_cb_fn(codec, 1, false);
6615 taiko_mbhc_init(codec);
6616 taiko_mbhc_cal(codec);
6617 taiko_mbhc_calc_thres(codec);
6618 taiko->mbhc_cfg.mclk_cb_fn(codec, 0, false);
6619 taiko_codec_calibrate_hs_polling(codec);
6620 if (!taiko->mbhc_cfg.gpio) {
6621 ret = taiko_codec_enable_hs_detect(codec, 1,
6622 MBHC_USE_MB_TRIGGER |
6623 MBHC_USE_HPHL_TRIGGER,
6624 false);
6625
6626 if (IS_ERR_VALUE(ret))
6627 pr_err("%s: Failed to setup MBHC detection\n",
6628 __func__);
6629 } else {
6630 /* Enable Mic Bias pull down and HPH Switch to GND */
6631 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.ctl_reg,
6632 0x01, 0x01);
6633 snd_soc_update_bits(codec, TAIKO_A_MBHC_HPH, 0x01, 0x01);
6634 INIT_WORK(&taiko->hs_correct_plug_work,
6635 taiko_hs_correct_gpio_plug);
6636 }
6637
6638 if (!IS_ERR_VALUE(ret)) {
6639 snd_soc_update_bits(codec, TAIKO_A_RX_HPH_OCP_CTL, 0x10, 0x10);
6640 wcd9xxx_enable_irq(codec->control_data,
6641 TAIKO_IRQ_HPH_PA_OCPL_FAULT);
6642 wcd9xxx_enable_irq(codec->control_data,
6643 TAIKO_IRQ_HPH_PA_OCPR_FAULT);
6644
6645 if (taiko->mbhc_cfg.gpio) {
6646 ret = request_threaded_irq(taiko->mbhc_cfg.gpio_irq,
6647 NULL,
6648 taiko_mechanical_plug_detect_irq,
6649 (IRQF_TRIGGER_RISING |
6650 IRQF_TRIGGER_FALLING),
6651 "taiko-gpio", codec);
6652 if (!IS_ERR_VALUE(ret)) {
6653 ret = enable_irq_wake(taiko->mbhc_cfg.gpio_irq);
6654 /* Bootup time detection */
6655 taiko_hs_gpio_handler(codec);
6656 }
6657 }
6658 }
6659
6660 return ret;
6661}
6662
6663static void mbhc_fw_read(struct work_struct *work)
6664{
6665 struct delayed_work *dwork;
6666 struct taiko_priv *taiko;
6667 struct snd_soc_codec *codec;
6668 const struct firmware *fw;
6669 int ret = -1, retry = 0;
6670
6671 dwork = to_delayed_work(work);
6672 taiko = container_of(dwork, struct taiko_priv, mbhc_firmware_dwork);
6673 codec = taiko->codec;
6674
6675 while (retry < MBHC_FW_READ_ATTEMPTS) {
6676 retry++;
6677 pr_info("%s:Attempt %d to request MBHC firmware\n",
6678 __func__, retry);
6679 ret = request_firmware(&fw, "wcd9320/wcd9320_mbhc.bin",
6680 codec->dev);
6681
6682 if (ret != 0) {
6683 usleep_range(MBHC_FW_READ_TIMEOUT,
6684 MBHC_FW_READ_TIMEOUT);
6685 } else {
6686 pr_info("%s: MBHC Firmware read succesful\n", __func__);
6687 break;
6688 }
6689 }
6690
6691 if (ret != 0) {
6692 pr_err("%s: Cannot load MBHC firmware use default cal\n",
6693 __func__);
6694 } else if (taiko_mbhc_fw_validate(fw) == false) {
6695 pr_err("%s: Invalid MBHC cal data size use default cal\n",
6696 __func__);
6697 release_firmware(fw);
6698 } else {
6699 taiko->mbhc_cfg.calibration = (void *)fw->data;
6700 taiko->mbhc_fw = fw;
6701 }
6702
6703 (void) taiko_mbhc_init_and_calibrate(taiko);
6704}
6705
6706int taiko_hs_detect(struct snd_soc_codec *codec,
6707 const struct taiko_mbhc_config *cfg)
6708{
6709 struct taiko_priv *taiko;
6710 int rc = 0;
6711
6712 if (!codec || !cfg->calibration) {
6713 pr_err("Error: no codec or calibration\n");
6714 return -EINVAL;
6715 }
6716
6717 if (cfg->mclk_rate != TAIKO_MCLK_RATE_12288KHZ) {
6718 if (cfg->mclk_rate == TAIKO_MCLK_RATE_9600KHZ)
6719 pr_err("Error: clock rate %dHz is not yet supported\n",
6720 cfg->mclk_rate);
6721 else
6722 pr_err("Error: unsupported clock rate %d\n",
6723 cfg->mclk_rate);
6724 return -EINVAL;
6725 }
6726
6727 taiko = snd_soc_codec_get_drvdata(codec);
6728 taiko->mbhc_cfg = *cfg;
6729 taiko->in_gpio_handler = false;
6730 taiko->current_plug = PLUG_TYPE_NONE;
6731 taiko->lpi_enabled = false;
6732 taiko_get_mbhc_micbias_regs(codec, &taiko->mbhc_bias_regs);
6733
6734 /* Put CFILT in fast mode by default */
6735 snd_soc_update_bits(codec, taiko->mbhc_bias_regs.cfilt_ctl,
6736 0x40, TAIKO_CFILT_FAST_MODE);
6737 INIT_DELAYED_WORK(&taiko->mbhc_firmware_dwork, mbhc_fw_read);
6738 INIT_DELAYED_WORK(&taiko->mbhc_btn_dwork, btn_lpress_fn);
6739 INIT_WORK(&taiko->hphlocp_work, hphlocp_off_report);
6740 INIT_WORK(&taiko->hphrocp_work, hphrocp_off_report);
6741 INIT_DELAYED_WORK(&taiko->mbhc_insert_dwork, taiko_mbhc_insert_work);
6742
6743 if (!taiko->mbhc_cfg.read_fw_bin)
6744 rc = taiko_mbhc_init_and_calibrate(taiko);
6745 else
6746 schedule_delayed_work(&taiko->mbhc_firmware_dwork,
6747 usecs_to_jiffies(MBHC_FW_READ_TIMEOUT));
6748
6749 return rc;
6750}
6751EXPORT_SYMBOL_GPL(taiko_hs_detect);
6752
6753static unsigned long slimbus_value;
6754
6755static irqreturn_t taiko_slimbus_irq(int irq, void *data)
6756{
6757 struct taiko_priv *priv = data;
6758 struct snd_soc_codec *codec = priv->codec;
6759 int i, j;
6760 u8 val;
6761
6762 for (i = 0; i < WCD9XXX_SLIM_NUM_PORT_REG; i++) {
6763 slimbus_value = wcd9xxx_interface_reg_read(codec->control_data,
6764 TAIKO_SLIM_PGD_PORT_INT_STATUS0 + i);
6765 for_each_set_bit(j, &slimbus_value, BITS_PER_BYTE) {
6766 val = wcd9xxx_interface_reg_read(codec->control_data,
6767 TAIKO_SLIM_PGD_PORT_INT_SOURCE0 + i*8 + j);
6768 if (val & 0x1)
6769 pr_err_ratelimited(
6770 "overflow error on port %x, value %x\n",
6771 i*8 + j, val);
6772 if (val & 0x2)
6773 pr_err_ratelimited(
6774 "underflow error on port %x, value %x\n",
6775 i*8 + j, val);
6776 }
6777 wcd9xxx_interface_reg_write(codec->control_data,
6778 TAIKO_SLIM_PGD_PORT_INT_CLR0 + i, 0xFF);
6779 }
6780
6781 return IRQ_HANDLED;
6782}
6783
6784static int taiko_handle_pdata(struct taiko_priv *taiko)
6785{
6786 struct snd_soc_codec *codec = taiko->codec;
6787 struct wcd9xxx_pdata *pdata = taiko->pdata;
6788 int k1, k2, k3, rc = 0;
6789 u8 leg_mode = pdata->amic_settings.legacy_mode;
6790 u8 txfe_bypass = pdata->amic_settings.txfe_enable;
6791 u8 txfe_buff = pdata->amic_settings.txfe_buff;
6792 u8 flag = pdata->amic_settings.use_pdata;
6793 u8 i = 0, j = 0;
6794 u8 val_txfe = 0, value = 0;
6795
6796 if (!pdata) {
6797 rc = -ENODEV;
6798 goto done;
6799 }
6800
6801 /* Make sure settings are correct */
6802 if ((pdata->micbias.ldoh_v > TAIKO_LDOH_2P85_V) ||
6803 (pdata->micbias.bias1_cfilt_sel > TAIKO_CFILT3_SEL) ||
6804 (pdata->micbias.bias2_cfilt_sel > TAIKO_CFILT3_SEL) ||
6805 (pdata->micbias.bias3_cfilt_sel > TAIKO_CFILT3_SEL) ||
6806 (pdata->micbias.bias4_cfilt_sel > TAIKO_CFILT3_SEL)) {
6807 rc = -EINVAL;
6808 goto done;
6809 }
6810
6811 /* figure out k value */
6812 k1 = taiko_find_k_value(pdata->micbias.ldoh_v,
6813 pdata->micbias.cfilt1_mv);
6814 k2 = taiko_find_k_value(pdata->micbias.ldoh_v,
6815 pdata->micbias.cfilt2_mv);
6816 k3 = taiko_find_k_value(pdata->micbias.ldoh_v,
6817 pdata->micbias.cfilt3_mv);
6818
6819 if (IS_ERR_VALUE(k1) || IS_ERR_VALUE(k2) || IS_ERR_VALUE(k3)) {
6820 rc = -EINVAL;
6821 goto done;
6822 }
6823
6824 /* Set voltage level and always use LDO */
6825 snd_soc_update_bits(codec, TAIKO_A_LDO_H_MODE_1, 0x0C,
6826 (pdata->micbias.ldoh_v << 2));
6827
6828 snd_soc_update_bits(codec, TAIKO_A_MICB_CFILT_1_VAL, 0xFC,
6829 (k1 << 2));
6830 snd_soc_update_bits(codec, TAIKO_A_MICB_CFILT_2_VAL, 0xFC,
6831 (k2 << 2));
6832 snd_soc_update_bits(codec, TAIKO_A_MICB_CFILT_3_VAL, 0xFC,
6833 (k3 << 2));
6834
6835 snd_soc_update_bits(codec, TAIKO_A_MICB_1_CTL, 0x60,
6836 (pdata->micbias.bias1_cfilt_sel << 5));
6837 snd_soc_update_bits(codec, TAIKO_A_MICB_2_CTL, 0x60,
6838 (pdata->micbias.bias2_cfilt_sel << 5));
6839 snd_soc_update_bits(codec, TAIKO_A_MICB_3_CTL, 0x60,
6840 (pdata->micbias.bias3_cfilt_sel << 5));
6841 snd_soc_update_bits(codec, taiko->reg_addr.micb_4_ctl, 0x60,
6842 (pdata->micbias.bias4_cfilt_sel << 5));
6843
6844 for (i = 0; i < 6; j++, i += 2) {
6845 if (flag & (0x01 << i)) {
6846 value = (leg_mode & (0x01 << i)) ? 0x10 : 0x00;
6847 val_txfe = (txfe_bypass & (0x01 << i)) ? 0x20 : 0x00;
6848 val_txfe = val_txfe |
6849 ((txfe_buff & (0x01 << i)) ? 0x10 : 0x00);
6850 snd_soc_update_bits(codec, TAIKO_A_TX_1_2_EN + j * 10,
6851 0x10, value);
6852 snd_soc_update_bits(codec,
6853 TAIKO_A_TX_1_2_TEST_EN + j * 10,
6854 0x30, val_txfe);
6855 }
6856 if (flag & (0x01 << (i + 1))) {
6857 value = (leg_mode & (0x01 << (i + 1))) ? 0x01 : 0x00;
6858 val_txfe = (txfe_bypass &
6859 (0x01 << (i + 1))) ? 0x02 : 0x00;
6860 val_txfe |= (txfe_buff &
6861 (0x01 << (i + 1))) ? 0x01 : 0x00;
6862 snd_soc_update_bits(codec, TAIKO_A_TX_1_2_EN + j * 10,
6863 0x01, value);
6864 snd_soc_update_bits(codec,
6865 TAIKO_A_TX_1_2_TEST_EN + j * 10,
6866 0x03, val_txfe);
6867 }
6868 }
6869 if (flag & 0x40) {
6870 value = (leg_mode & 0x40) ? 0x10 : 0x00;
6871 value = value | ((txfe_bypass & 0x40) ? 0x02 : 0x00);
6872 value = value | ((txfe_buff & 0x40) ? 0x01 : 0x00);
6873 snd_soc_update_bits(codec, TAIKO_A_TX_7_MBHC_EN,
6874 0x13, value);
6875 }
6876
6877 if (pdata->ocp.use_pdata) {
6878 /* not defined in CODEC specification */
6879 if (pdata->ocp.hph_ocp_limit == 1 ||
6880 pdata->ocp.hph_ocp_limit == 5) {
6881 rc = -EINVAL;
6882 goto done;
6883 }
6884 snd_soc_update_bits(codec, TAIKO_A_RX_COM_OCP_CTL,
6885 0x0F, pdata->ocp.num_attempts);
6886 snd_soc_write(codec, TAIKO_A_RX_COM_OCP_COUNT,
6887 ((pdata->ocp.run_time << 4) | pdata->ocp.wait_time));
6888 snd_soc_update_bits(codec, TAIKO_A_RX_HPH_OCP_CTL,
6889 0xE0, (pdata->ocp.hph_ocp_limit << 5));
6890 }
6891
6892 for (i = 0; i < ARRAY_SIZE(pdata->regulator); i++) {
6893 if (!strncmp(pdata->regulator[i].name, "CDC_VDDA_RX", 11)) {
6894 if (pdata->regulator[i].min_uV == 1800000 &&
6895 pdata->regulator[i].max_uV == 1800000) {
6896 snd_soc_write(codec, TAIKO_A_BIAS_REF_CTL,
6897 0x1C);
6898 } else if (pdata->regulator[i].min_uV == 2200000 &&
6899 pdata->regulator[i].max_uV == 2200000) {
6900 snd_soc_write(codec, TAIKO_A_BIAS_REF_CTL,
6901 0x1E);
6902 } else {
6903 pr_err("%s: unsupported CDC_VDDA_RX voltage\n"
6904 "min %d, max %d\n", __func__,
6905 pdata->regulator[i].min_uV,
6906 pdata->regulator[i].max_uV);
6907 rc = -EINVAL;
6908 }
6909 break;
6910 }
6911 }
6912done:
6913 return rc;
6914}
6915
6916static const struct taiko_reg_mask_val taiko_1_0_reg_defaults[] = {
6917
6918 /* Taiko 1.1 MICBIAS changes */
6919 TAIKO_REG_VAL(TAIKO_A_MICB_1_INT_RBIAS, 0x24),
6920 TAIKO_REG_VAL(TAIKO_A_MICB_2_INT_RBIAS, 0x24),
6921 TAIKO_REG_VAL(TAIKO_A_MICB_3_INT_RBIAS, 0x24),
6922
6923 /* Taiko 1.1 HPH changes */
6924 TAIKO_REG_VAL(TAIKO_A_RX_HPH_BIAS_PA, 0x57),
6925 TAIKO_REG_VAL(TAIKO_A_RX_HPH_BIAS_LDO, 0x56),
6926
6927 /* Taiko 1.1 EAR PA changes */
6928 TAIKO_REG_VAL(TAIKO_A_RX_EAR_BIAS_PA, 0xA6),
6929 TAIKO_REG_VAL(TAIKO_A_RX_EAR_GAIN, 0x02),
6930 TAIKO_REG_VAL(TAIKO_A_RX_EAR_VCM, 0x03),
6931
6932
6933 /* Taiko 1.1 RX Changes */
6934 TAIKO_REG_VAL(TAIKO_A_CDC_RX1_B5_CTL, 0x78),
6935 TAIKO_REG_VAL(TAIKO_A_CDC_RX2_B5_CTL, 0x78),
6936 TAIKO_REG_VAL(TAIKO_A_CDC_RX3_B5_CTL, 0x78),
6937 TAIKO_REG_VAL(TAIKO_A_CDC_RX4_B5_CTL, 0x78),
6938 TAIKO_REG_VAL(TAIKO_A_CDC_RX5_B5_CTL, 0x78),
6939 TAIKO_REG_VAL(TAIKO_A_CDC_RX6_B5_CTL, 0x78),
6940 TAIKO_REG_VAL(TAIKO_A_CDC_RX7_B5_CTL, 0x78),
6941
6942 /* Taiko 1.1 RX1 and RX2 Changes */
6943 TAIKO_REG_VAL(TAIKO_A_CDC_RX1_B6_CTL, 0xA0),
6944 TAIKO_REG_VAL(TAIKO_A_CDC_RX2_B6_CTL, 0xA0),
6945
6946 /* Taiko 1.1 RX3 to RX7 Changes */
6947 TAIKO_REG_VAL(TAIKO_A_CDC_RX3_B6_CTL, 0x80),
6948 TAIKO_REG_VAL(TAIKO_A_CDC_RX4_B6_CTL, 0x80),
6949 TAIKO_REG_VAL(TAIKO_A_CDC_RX5_B6_CTL, 0x80),
6950 TAIKO_REG_VAL(TAIKO_A_CDC_RX6_B6_CTL, 0x80),
6951 TAIKO_REG_VAL(TAIKO_A_CDC_RX7_B6_CTL, 0x80),
6952
6953};
6954
6955static void taiko_update_reg_defaults(struct snd_soc_codec *codec)
6956{
6957 u32 i;
6958
6959 for (i = 0; i < ARRAY_SIZE(taiko_1_0_reg_defaults); i++)
6960 snd_soc_write(codec, taiko_1_0_reg_defaults[i].reg,
6961 taiko_1_0_reg_defaults[i].val);
6962}
6963
6964static const struct taiko_reg_mask_val taiko_codec_reg_init_val[] = {
6965 /* Initialize current threshold to 350MA
6966 * number of wait and run cycles to 4096
6967 */
6968 {TAIKO_A_RX_HPH_OCP_CTL, 0xE0, 0x60},
6969 {TAIKO_A_RX_COM_OCP_COUNT, 0xFF, 0xFF},
6970
6971 {TAIKO_A_QFUSE_CTL, 0xFF, 0x03},
6972
6973 /* Initialize gain registers to use register gain */
6974 {TAIKO_A_RX_HPH_L_GAIN, 0x10, 0x10},
6975 {TAIKO_A_RX_HPH_R_GAIN, 0x10, 0x10},
6976 {TAIKO_A_RX_LINE_1_GAIN, 0x10, 0x10},
6977 {TAIKO_A_RX_LINE_2_GAIN, 0x10, 0x10},
6978 {TAIKO_A_RX_LINE_3_GAIN, 0x10, 0x10},
6979 {TAIKO_A_RX_LINE_4_GAIN, 0x10, 0x10},
6980
6981 /* Initialize mic biases to differential mode */
6982 {TAIKO_A_MICB_1_INT_RBIAS, 0x24, 0x24},
6983 {TAIKO_A_MICB_2_INT_RBIAS, 0x24, 0x24},
6984 {TAIKO_A_MICB_3_INT_RBIAS, 0x24, 0x24},
6985
6986
6987 /* Use 16 bit sample size for TX1 to TX6 */
6988 {TAIKO_A_CDC_CONN_TX_SB_B1_CTL, 0x30, 0x20},
6989 {TAIKO_A_CDC_CONN_TX_SB_B2_CTL, 0x30, 0x20},
6990 {TAIKO_A_CDC_CONN_TX_SB_B3_CTL, 0x30, 0x20},
6991 {TAIKO_A_CDC_CONN_TX_SB_B4_CTL, 0x30, 0x20},
6992 {TAIKO_A_CDC_CONN_TX_SB_B5_CTL, 0x30, 0x20},
6993 {TAIKO_A_CDC_CONN_TX_SB_B6_CTL, 0x30, 0x20},
6994
6995 /* Use 16 bit sample size for TX7 to TX10 */
6996 {TAIKO_A_CDC_CONN_TX_SB_B7_CTL, 0x60, 0x40},
6997 {TAIKO_A_CDC_CONN_TX_SB_B8_CTL, 0x60, 0x40},
6998 {TAIKO_A_CDC_CONN_TX_SB_B9_CTL, 0x60, 0x40},
6999 {TAIKO_A_CDC_CONN_TX_SB_B10_CTL, 0x60, 0x40},
7000
7001 /* Use 16 bit sample size for RX */
7002 {TAIKO_A_CDC_CONN_RX_SB_B1_CTL, 0xFF, 0xAA},
7003 {TAIKO_A_CDC_CONN_RX_SB_B2_CTL, 0xFF, 0xAA},
7004
7005 /*enable HPF filter for TX paths */
7006 {TAIKO_A_CDC_TX1_MUX_CTL, 0x8, 0x0},
7007 {TAIKO_A_CDC_TX2_MUX_CTL, 0x8, 0x0},
7008 {TAIKO_A_CDC_TX3_MUX_CTL, 0x8, 0x0},
7009 {TAIKO_A_CDC_TX4_MUX_CTL, 0x8, 0x0},
7010 {TAIKO_A_CDC_TX5_MUX_CTL, 0x8, 0x0},
7011 {TAIKO_A_CDC_TX6_MUX_CTL, 0x8, 0x0},
7012 {TAIKO_A_CDC_TX7_MUX_CTL, 0x8, 0x0},
7013 {TAIKO_A_CDC_TX8_MUX_CTL, 0x8, 0x0},
7014 {TAIKO_A_CDC_TX9_MUX_CTL, 0x8, 0x0},
7015 {TAIKO_A_CDC_TX10_MUX_CTL, 0x8, 0x0},
7016
7017 /* config Decimator for DMIC CLK_MODE_1(4.8Mhz@9.6Mhz mclk) */
7018 {TAIKO_A_CDC_TX1_DMIC_CTL, 0x7, 0x0},
7019 {TAIKO_A_CDC_TX2_DMIC_CTL, 0x7, 0x0},
7020 {TAIKO_A_CDC_TX3_DMIC_CTL, 0x7, 0x0},
7021 {TAIKO_A_CDC_TX4_DMIC_CTL, 0x7, 0x0},
7022 {TAIKO_A_CDC_TX5_DMIC_CTL, 0x7, 0x0},
7023 {TAIKO_A_CDC_TX6_DMIC_CTL, 0x7, 0x0},
7024 {TAIKO_A_CDC_TX7_DMIC_CTL, 0x7, 0x0},
7025 {TAIKO_A_CDC_TX8_DMIC_CTL, 0x7, 0x0},
7026 {TAIKO_A_CDC_TX9_DMIC_CTL, 0x7, 0x0},
7027 {TAIKO_A_CDC_TX10_DMIC_CTL, 0x7, 0x0},
7028
7029 /* config DMIC clk to CLK_MODE_1 (4.8Mhz@9.6Mhz mclk) */
7030 {TAIKO_A_CDC_CLK_DMIC_B1_CTL, 0xEE, 0x0},
7031 {TAIKO_A_CDC_CLK_DMIC_B2_CTL, 0xEE, 0x0},
7032};
7033
7034static void taiko_codec_init_reg(struct snd_soc_codec *codec)
7035{
7036 u32 i;
7037
7038 for (i = 0; i < ARRAY_SIZE(taiko_codec_reg_init_val); i++)
7039 snd_soc_update_bits(codec, taiko_codec_reg_init_val[i].reg,
7040 taiko_codec_reg_init_val[i].mask,
7041 taiko_codec_reg_init_val[i].val);
7042}
7043
7044static void taiko_update_reg_address(struct taiko_priv *priv)
7045{
7046 struct taiko_reg_address *reg_addr = &priv->reg_addr;
7047 reg_addr->micb_4_mbhc = TAIKO_A_MICB_4_MBHC;
7048 reg_addr->micb_4_int_rbias = TAIKO_A_MICB_4_INT_RBIAS;
7049 reg_addr->micb_4_ctl = TAIKO_A_MICB_4_CTL;
7050
7051}
7052
7053#ifdef CONFIG_DEBUG_FS
7054static int codec_debug_open(struct inode *inode, struct file *file)
7055{
7056 file->private_data = inode->i_private;
7057 return 0;
7058}
7059
7060static ssize_t codec_debug_write(struct file *filp,
7061 const char __user *ubuf, size_t cnt, loff_t *ppos)
7062{
7063 char lbuf[32];
7064 char *buf;
7065 int rc;
7066 struct taiko_priv *taiko = filp->private_data;
7067
7068 if (cnt > sizeof(lbuf) - 1)
7069 return -EINVAL;
7070
7071 rc = copy_from_user(lbuf, ubuf, cnt);
7072 if (rc)
7073 return -EFAULT;
7074
7075 lbuf[cnt] = '\0';
7076 buf = (char *)lbuf;
7077 taiko->no_mic_headset_override = (*strsep(&buf, " ") == '0') ?
7078 false : true;
7079 return rc;
7080}
7081
7082static ssize_t codec_mbhc_debug_read(struct file *file, char __user *buf,
7083 size_t count, loff_t *pos)
7084{
7085 const int size = 768;
7086 char buffer[size];
7087 int n = 0;
7088 struct taiko_priv *taiko = file->private_data;
7089 struct snd_soc_codec *codec = taiko->codec;
7090 const struct mbhc_internal_cal_data *p = &taiko->mbhc_data;
7091 const s16 v_ins_hu_cur = taiko_get_current_v_ins(taiko, true);
7092 const s16 v_ins_h_cur = taiko_get_current_v_ins(taiko, false);
7093
7094 n = scnprintf(buffer, size - n, "dce_z = %x(%dmv)\n", p->dce_z,
7095 taiko_codec_sta_dce_v(codec, 1, p->dce_z));
7096 n += scnprintf(buffer + n, size - n, "dce_mb = %x(%dmv)\n",
7097 p->dce_mb, taiko_codec_sta_dce_v(codec, 1, p->dce_mb));
7098 n += scnprintf(buffer + n, size - n, "sta_z = %x(%dmv)\n",
7099 p->sta_z, taiko_codec_sta_dce_v(codec, 0, p->sta_z));
7100 n += scnprintf(buffer + n, size - n, "sta_mb = %x(%dmv)\n",
7101 p->sta_mb, taiko_codec_sta_dce_v(codec, 0, p->sta_mb));
7102 n += scnprintf(buffer + n, size - n, "t_dce = %x\n", p->t_dce);
7103 n += scnprintf(buffer + n, size - n, "t_sta = %x\n", p->t_sta);
7104 n += scnprintf(buffer + n, size - n, "micb_mv = %dmv\n",
7105 p->micb_mv);
7106 n += scnprintf(buffer + n, size - n, "v_ins_hu = %x(%dmv)%s\n",
7107 p->v_ins_hu,
7108 taiko_codec_sta_dce_v(codec, 0, p->v_ins_hu),
7109 p->v_ins_hu == v_ins_hu_cur ? "*" : "");
7110 n += scnprintf(buffer + n, size - n, "v_ins_h = %x(%dmv)%s\n",
7111 p->v_ins_h, taiko_codec_sta_dce_v(codec, 1, p->v_ins_h),
7112 p->v_ins_h == v_ins_h_cur ? "*" : "");
7113 n += scnprintf(buffer + n, size - n, "adj_v_ins_hu = %x(%dmv)%s\n",
7114 p->adj_v_ins_hu,
7115 taiko_codec_sta_dce_v(codec, 0, p->adj_v_ins_hu),
7116 p->adj_v_ins_hu == v_ins_hu_cur ? "*" : "");
7117 n += scnprintf(buffer + n, size - n, "adj_v_ins_h = %x(%dmv)%s\n",
7118 p->adj_v_ins_h,
7119 taiko_codec_sta_dce_v(codec, 1, p->adj_v_ins_h),
7120 p->adj_v_ins_h == v_ins_h_cur ? "*" : "");
7121 n += scnprintf(buffer + n, size - n, "v_b1_hu = %x(%dmv)\n",
7122 p->v_b1_hu, taiko_codec_sta_dce_v(codec, 0, p->v_b1_hu));
7123 n += scnprintf(buffer + n, size - n, "v_b1_h = %x(%dmv)\n",
7124 p->v_b1_h, taiko_codec_sta_dce_v(codec, 1, p->v_b1_h));
7125 n += scnprintf(buffer + n, size - n, "v_b1_huc = %x(%dmv)\n",
7126 p->v_b1_huc,
7127 taiko_codec_sta_dce_v(codec, 1, p->v_b1_huc));
7128 n += scnprintf(buffer + n, size - n, "v_brh = %x(%dmv)\n",
7129 p->v_brh, taiko_codec_sta_dce_v(codec, 1, p->v_brh));
7130 n += scnprintf(buffer + n, size - n, "v_brl = %x(%dmv)\n", p->v_brl,
7131 taiko_codec_sta_dce_v(codec, 0, p->v_brl));
7132 n += scnprintf(buffer + n, size - n, "v_no_mic = %x(%dmv)\n",
7133 p->v_no_mic,
7134 taiko_codec_sta_dce_v(codec, 0, p->v_no_mic));
7135 n += scnprintf(buffer + n, size - n, "npoll = %d\n", p->npoll);
7136 n += scnprintf(buffer + n, size - n, "nbounce_wait = %d\n",
7137 p->nbounce_wait);
7138 n += scnprintf(buffer + n, size - n, "v_inval_ins_low = %d\n",
7139 p->v_inval_ins_low);
7140 n += scnprintf(buffer + n, size - n, "v_inval_ins_high = %d\n",
7141 p->v_inval_ins_high);
7142 if (taiko->mbhc_cfg.gpio)
7143 n += scnprintf(buffer + n, size - n, "GPIO insert = %d\n",
7144 taiko_hs_gpio_level_remove(taiko));
7145 buffer[n] = 0;
7146
7147 return simple_read_from_buffer(buf, count, pos, buffer, n);
7148}
7149
7150static const struct file_operations codec_debug_ops = {
7151 .open = codec_debug_open,
7152 .write = codec_debug_write,
7153};
7154
7155static const struct file_operations codec_mbhc_debug_ops = {
7156 .open = codec_debug_open,
7157 .read = codec_mbhc_debug_read,
7158};
7159#endif
7160
7161static int taiko_codec_probe(struct snd_soc_codec *codec)
7162{
7163 struct wcd9xxx *control;
7164 struct taiko_priv *taiko;
7165 struct snd_soc_dapm_context *dapm = &codec->dapm;
7166 int ret = 0;
7167 int i;
7168 int ch_cnt;
7169
7170 codec->control_data = dev_get_drvdata(codec->dev->parent);
7171 control = codec->control_data;
7172
7173 taiko = kzalloc(sizeof(struct taiko_priv), GFP_KERNEL);
7174 if (!taiko) {
7175 dev_err(codec->dev, "Failed to allocate private data\n");
7176 return -ENOMEM;
7177 }
7178 for (i = 0 ; i < NUM_DECIMATORS; i++) {
7179 tx_hpf_work[i].taiko = taiko;
7180 tx_hpf_work[i].decimator = i + 1;
7181 INIT_DELAYED_WORK(&tx_hpf_work[i].dwork,
7182 tx_hpf_corner_freq_callback);
7183 }
7184
7185 /* Make sure mbhc micbias register addresses are zeroed out */
7186 memset(&taiko->mbhc_bias_regs, 0,
7187 sizeof(struct mbhc_micbias_regs));
7188 taiko->mbhc_micbias_switched = false;
7189
7190 /* Make sure mbhc intenal calibration data is zeroed out */
7191 memset(&taiko->mbhc_data, 0,
7192 sizeof(struct mbhc_internal_cal_data));
7193 taiko->mbhc_data.t_sta_dce = DEFAULT_DCE_STA_WAIT;
7194 taiko->mbhc_data.t_dce = DEFAULT_DCE_WAIT;
7195 taiko->mbhc_data.t_sta = DEFAULT_STA_WAIT;
7196 snd_soc_codec_set_drvdata(codec, taiko);
7197
7198 taiko->mclk_enabled = false;
7199 taiko->bandgap_type = TAIKO_BANDGAP_OFF;
7200 taiko->clock_active = false;
7201 taiko->config_mode_active = false;
7202 taiko->mbhc_polling_active = false;
7203 taiko->mbhc_fake_ins_start = 0;
7204 taiko->no_mic_headset_override = false;
7205 taiko->hs_polling_irq_prepared = false;
7206 mutex_init(&taiko->codec_resource_lock);
7207 taiko->codec = codec;
7208 taiko->mbhc_state = MBHC_STATE_NONE;
7209 taiko->mbhc_last_resume = 0;
7210 for (i = 0; i < COMPANDER_MAX; i++) {
7211 taiko->comp_enabled[i] = 0;
7212 taiko->comp_fs[i] = COMPANDER_FS_48KHZ;
7213 }
7214 taiko->pdata = dev_get_platdata(codec->dev->parent);
7215 taiko->intf_type = wcd9xxx_get_intf_type();
7216 taiko->aux_pga_cnt = 0;
7217 taiko->aux_l_gain = 0x1F;
7218 taiko->aux_r_gain = 0x1F;
7219 taiko_update_reg_address(taiko);
7220 taiko_update_reg_defaults(codec);
7221 taiko_codec_init_reg(codec);
7222 ret = taiko_handle_pdata(taiko);
7223 if (IS_ERR_VALUE(ret)) {
7224 pr_err("%s: bad pdata\n", __func__);
7225 goto err_pdata;
7226 }
7227
7228 if (taiko->intf_type == WCD9XXX_INTERFACE_TYPE_I2C) {
7229 snd_soc_dapm_new_controls(dapm, taiko_dapm_i2s_widgets,
7230 ARRAY_SIZE(taiko_dapm_i2s_widgets));
7231 snd_soc_dapm_add_routes(dapm, audio_i2s_map,
7232 ARRAY_SIZE(audio_i2s_map));
7233 }
7234
7235 snd_soc_dapm_sync(dapm);
7236
7237 ret = wcd9xxx_request_irq(codec->control_data, TAIKO_IRQ_MBHC_INSERTION,
7238 taiko_hs_insert_irq, "Headset insert detect", taiko);
7239 if (ret) {
7240 pr_err("%s: Failed to request irq %d\n", __func__,
7241 TAIKO_IRQ_MBHC_INSERTION);
7242 goto err_insert_irq;
7243 }
7244 wcd9xxx_disable_irq(codec->control_data, TAIKO_IRQ_MBHC_INSERTION);
7245
7246 ret = wcd9xxx_request_irq(codec->control_data, TAIKO_IRQ_MBHC_REMOVAL,
7247 taiko_hs_remove_irq, "Headset remove detect", taiko);
7248 if (ret) {
7249 pr_err("%s: Failed to request irq %d\n", __func__,
7250 TAIKO_IRQ_MBHC_REMOVAL);
7251 goto err_remove_irq;
7252 }
7253
7254 ret = wcd9xxx_request_irq(codec->control_data, TAIKO_IRQ_MBHC_POTENTIAL,
7255 taiko_dce_handler, "DC Estimation detect", taiko);
7256 if (ret) {
7257 pr_err("%s: Failed to request irq %d\n", __func__,
7258 TAIKO_IRQ_MBHC_POTENTIAL);
7259 goto err_potential_irq;
7260 }
7261
7262 ret = wcd9xxx_request_irq(codec->control_data, TAIKO_IRQ_MBHC_RELEASE,
7263 taiko_release_handler, "Button Release detect", taiko);
7264 if (ret) {
7265 pr_err("%s: Failed to request irq %d\n", __func__,
7266 TAIKO_IRQ_MBHC_RELEASE);
7267 goto err_release_irq;
7268 }
7269
7270 ret = wcd9xxx_request_irq(codec->control_data, TAIKO_IRQ_SLIMBUS,
7271 taiko_slimbus_irq, "SLIMBUS Slave", taiko);
7272 if (ret) {
7273 pr_err("%s: Failed to request irq %d\n", __func__,
7274 TAIKO_IRQ_SLIMBUS);
7275 goto err_slimbus_irq;
7276 }
7277
7278 for (i = 0; i < WCD9XXX_SLIM_NUM_PORT_REG; i++)
7279 wcd9xxx_interface_reg_write(codec->control_data,
7280 TAIKO_SLIM_PGD_PORT_INT_EN0 + i, 0xFF);
7281
7282 ret = wcd9xxx_request_irq(codec->control_data,
7283 TAIKO_IRQ_HPH_PA_OCPL_FAULT, taiko_hphl_ocp_irq,
7284 "HPH_L OCP detect", taiko);
7285 if (ret) {
7286 pr_err("%s: Failed to request irq %d\n", __func__,
7287 TAIKO_IRQ_HPH_PA_OCPL_FAULT);
7288 goto err_hphl_ocp_irq;
7289 }
7290 wcd9xxx_disable_irq(codec->control_data, TAIKO_IRQ_HPH_PA_OCPL_FAULT);
7291
7292 ret = wcd9xxx_request_irq(codec->control_data,
7293 TAIKO_IRQ_HPH_PA_OCPR_FAULT, taiko_hphr_ocp_irq,
7294 "HPH_R OCP detect", taiko);
7295 if (ret) {
7296 pr_err("%s: Failed to request irq %d\n", __func__,
7297 TAIKO_IRQ_HPH_PA_OCPR_FAULT);
7298 goto err_hphr_ocp_irq;
7299 }
7300 wcd9xxx_disable_irq(codec->control_data, TAIKO_IRQ_HPH_PA_OCPR_FAULT);
7301 for (i = 0; i < ARRAY_SIZE(taiko_dai); i++) {
7302 switch (taiko_dai[i].id) {
7303 case AIF1_PB:
7304 ch_cnt = taiko_dai[i].playback.channels_max;
7305 break;
7306 case AIF1_CAP:
7307 ch_cnt = taiko_dai[i].capture.channels_max;
7308 break;
7309 case AIF2_PB:
7310 ch_cnt = taiko_dai[i].playback.channels_max;
7311 break;
7312 case AIF2_CAP:
7313 ch_cnt = taiko_dai[i].capture.channels_max;
7314 break;
7315 case AIF3_PB:
7316 ch_cnt = taiko_dai[i].playback.channels_max;
7317 break;
7318 case AIF3_CAP:
7319 ch_cnt = taiko_dai[i].capture.channels_max;
7320 break;
7321 default:
7322 continue;
7323 }
7324 taiko->dai[i].ch_num = kzalloc((sizeof(unsigned int)*
7325 ch_cnt), GFP_KERNEL);
7326 }
7327
7328#ifdef CONFIG_DEBUG_FS
7329 if (ret == 0) {
7330 taiko->debugfs_poke =
7331 debugfs_create_file("TRRS", S_IFREG | S_IRUGO, NULL, taiko,
7332 &codec_debug_ops);
7333 taiko->debugfs_mbhc =
7334 debugfs_create_file("taiko_mbhc", S_IFREG | S_IRUGO,
7335 NULL, taiko, &codec_mbhc_debug_ops);
7336 }
7337#endif
7338 codec->ignore_pmdown_time = 1;
7339 return ret;
7340
7341err_hphr_ocp_irq:
7342 wcd9xxx_free_irq(codec->control_data,
7343 TAIKO_IRQ_HPH_PA_OCPL_FAULT, taiko);
7344err_hphl_ocp_irq:
7345 wcd9xxx_free_irq(codec->control_data, TAIKO_IRQ_SLIMBUS, taiko);
7346err_slimbus_irq:
7347 wcd9xxx_free_irq(codec->control_data, TAIKO_IRQ_MBHC_RELEASE, taiko);
7348err_release_irq:
7349 wcd9xxx_free_irq(codec->control_data, TAIKO_IRQ_MBHC_POTENTIAL, taiko);
7350err_potential_irq:
7351 wcd9xxx_free_irq(codec->control_data, TAIKO_IRQ_MBHC_REMOVAL, taiko);
7352err_remove_irq:
7353 wcd9xxx_free_irq(codec->control_data, TAIKO_IRQ_MBHC_INSERTION, taiko);
7354err_insert_irq:
7355err_pdata:
7356 mutex_destroy(&taiko->codec_resource_lock);
7357 kfree(taiko);
7358 return ret;
7359}
7360static int taiko_codec_remove(struct snd_soc_codec *codec)
7361{
7362 int i;
7363 struct taiko_priv *taiko = snd_soc_codec_get_drvdata(codec);
7364 wcd9xxx_free_irq(codec->control_data, TAIKO_IRQ_SLIMBUS, taiko);
7365 wcd9xxx_free_irq(codec->control_data, TAIKO_IRQ_MBHC_RELEASE, taiko);
7366 wcd9xxx_free_irq(codec->control_data, TAIKO_IRQ_MBHC_POTENTIAL, taiko);
7367 wcd9xxx_free_irq(codec->control_data, TAIKO_IRQ_MBHC_REMOVAL, taiko);
7368 wcd9xxx_free_irq(codec->control_data, TAIKO_IRQ_MBHC_INSERTION, taiko);
7369 TAIKO_ACQUIRE_LOCK(taiko->codec_resource_lock);
7370 taiko_codec_disable_clock_block(codec);
7371 TAIKO_RELEASE_LOCK(taiko->codec_resource_lock);
7372 taiko_codec_enable_bandgap(codec, TAIKO_BANDGAP_OFF);
7373 if (taiko->mbhc_fw)
7374 release_firmware(taiko->mbhc_fw);
7375 for (i = 0; i < ARRAY_SIZE(taiko_dai); i++)
7376 kfree(taiko->dai[i].ch_num);
7377 mutex_destroy(&taiko->codec_resource_lock);
7378#ifdef CONFIG_DEBUG_FS
7379 debugfs_remove(taiko->debugfs_poke);
7380 debugfs_remove(taiko->debugfs_mbhc);
7381#endif
7382 kfree(taiko);
7383 return 0;
7384}
7385static struct snd_soc_codec_driver soc_codec_dev_taiko = {
7386 .probe = taiko_codec_probe,
7387 .remove = taiko_codec_remove,
7388
7389 .read = taiko_read,
7390 .write = taiko_write,
7391
7392 .readable_register = taiko_readable,
7393 .volatile_register = taiko_volatile,
7394
7395 .reg_cache_size = TAIKO_CACHE_SIZE,
7396 .reg_cache_default = taiko_reg_defaults,
7397 .reg_word_size = 1,
7398
7399 .controls = taiko_snd_controls,
7400 .num_controls = ARRAY_SIZE(taiko_snd_controls),
7401 .dapm_widgets = taiko_dapm_widgets,
7402 .num_dapm_widgets = ARRAY_SIZE(taiko_dapm_widgets),
7403 .dapm_routes = audio_map,
7404 .num_dapm_routes = ARRAY_SIZE(audio_map),
7405};
7406
7407#ifdef CONFIG_PM
7408static int taiko_suspend(struct device *dev)
7409{
7410 dev_dbg(dev, "%s: system suspend\n", __func__);
7411 return 0;
7412}
7413
7414static int taiko_resume(struct device *dev)
7415{
7416 struct platform_device *pdev = to_platform_device(dev);
7417 struct taiko_priv *taiko = platform_get_drvdata(pdev);
7418 dev_dbg(dev, "%s: system resume\n", __func__);
7419 taiko->mbhc_last_resume = jiffies;
7420 return 0;
7421}
7422
7423static const struct dev_pm_ops taiko_pm_ops = {
7424 .suspend = taiko_suspend,
7425 .resume = taiko_resume,
7426};
7427#endif
7428
7429static int __devinit taiko_probe(struct platform_device *pdev)
7430{
7431 int ret = 0;
7432 if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_SLIMBUS)
7433 ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_taiko,
7434 taiko_dai, ARRAY_SIZE(taiko_dai));
7435 else if (wcd9xxx_get_intf_type() == WCD9XXX_INTERFACE_TYPE_I2C)
7436 ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_taiko,
7437 taiko_i2s_dai, ARRAY_SIZE(taiko_i2s_dai));
7438 return ret;
7439}
7440static int __devexit taiko_remove(struct platform_device *pdev)
7441{
7442 snd_soc_unregister_codec(&pdev->dev);
7443 return 0;
7444}
7445static struct platform_driver taiko_codec_driver = {
7446 .probe = taiko_probe,
7447 .remove = taiko_remove,
7448 .driver = {
7449 .name = "taiko_codec",
7450 .owner = THIS_MODULE,
7451#ifdef CONFIG_PM
7452 .pm = &taiko_pm_ops,
7453#endif
7454 },
7455};
7456
7457static int __init taiko_codec_init(void)
7458{
7459 return platform_driver_register(&taiko_codec_driver);
7460}
7461
7462static void __exit taiko_codec_exit(void)
7463{
7464 platform_driver_unregister(&taiko_codec_driver);
7465}
7466
7467module_init(taiko_codec_init);
7468module_exit(taiko_codec_exit);
7469
7470MODULE_DESCRIPTION("Taiko codec driver");
7471MODULE_LICENSE("GPL v2");