2 * sound/soc/sprd/codec/sprd/sprd-codec-v3.c
4 * SPRD-CODEC -- SpreadTrum Tiger intergrated codec.
6 * Copyright (C) 2013 SpreadTrum Ltd.
8 * This software is licensed under the terms of the GNU General Public
9 * License version 2, as published by the Free Software Foundation, and
10 * may be copied, distributed, and modified under those terms.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 #define pr_fmt(fmt) "[audio:codec] " fmt
21 #include <asm/atomic.h>
22 #include <ubi_uboot.h>
24 #include <asm/arch/ldo.h>
25 #include <asm/arch/sprd-audio.h>
26 #include "sprd-codec-v3.h"
28 #ifdef CONFIG_SPRD_AUDIO_DEBUG
29 #define sprd_codec_dbg pr_info
30 #define sprd_bug_on BUG_ON
32 #define sprd_codec_dbg(...)
33 #define sprd_bug_on(...)
36 #define SOC_REG(reg) reg
38 #define DEFINE_SPINLOCK(...)
39 #define DEFINE_MUTEX(...)
41 struct snd_soc_codec {
43 unsigned int (*read) (struct snd_soc_codec *, unsigned int);
44 int (*write) (struct snd_soc_codec *, unsigned int, unsigned int);
45 struct sprd_codec_priv *sprd_codec;
48 static inline void snd_soc_codec_set_drvdata(struct snd_soc_codec *codec,
51 codec->sprd_codec = data;
54 static inline void *snd_soc_codec_get_drvdata(struct snd_soc_codec *codec)
56 return (void *)codec->sprd_codec;
59 const char *sprd_codec_pga_debug_str[SPRD_CODEC_PGA_MAX] = {
76 typedef int (*sprd_codec_pga_set) (struct snd_soc_codec * codec, int pgaval);
78 struct sprd_codec_pga {
79 sprd_codec_pga_set set;
83 struct sprd_codec_pga_op {
85 sprd_codec_pga_set set;
88 const char *sprd_codec_mixer_debug_str[SPRD_CODEC_MIXER_MAX] = {
119 #define IS_SPRD_CODEC_MIXER_RANG(reg) (((reg) >= SPRD_CODEC_MIXER_START) && ((reg) <= SPRD_CODEC_MIXER_MAX))
121 typedef int (*sprd_codec_mixer_set) (struct snd_soc_codec * codec, int on);
122 struct sprd_codec_mixer {
124 sprd_codec_mixer_set set;
127 struct sprd_codec_inter_pa {
128 /* FIXME little endian */
132 int is_classD_mode:1;
134 int is_auto_LDO_mode:1;
138 struct sprd_codec_pa_setting {
140 struct sprd_codec_inter_pa setting;
146 DEFINE_MUTEX(inter_pa_mutex);
147 static struct sprd_codec_pa_setting inter_pa;
149 struct sprd_codec_inter_hp_pa {
150 /* FIXME little endian */
153 int class_g_low_power:2;
157 struct sprd_codec_hp_pa_setting {
159 struct sprd_codec_inter_hp_pa setting;
165 DEFINE_MUTEX(inter_hp_pa_mutex);
166 static struct sprd_codec_hp_pa_setting inter_hp_pa;
168 static const char *mic_bias_name[SPRD_CODEC_MIC_BIAS_MAX] = {
174 /* codec private data */
175 struct sprd_codec_priv {
176 struct snd_soc_codec *codec;
177 atomic_t power_refcount;
178 atomic_t adie_dac_refcount;
179 atomic_t adie_adc_refcount;
180 atomic_t adc_power_refcount;
181 atomic_t adc_digital_power_refcount;
182 atomic_t dac_power_refcount;
183 atomic_t dac_digital_power_refcount;
184 atomic_t digital_power_refcount;
185 atomic_t analog_power_refcount;
188 struct sprd_codec_mixer mixer[SPRD_CODEC_MIXER_MAX];
189 struct sprd_codec_pga_op pga[SPRD_CODEC_PGA_MAX];
190 int mic_bias[SPRD_CODEC_MIC_BIAS_MAX];
191 #ifdef CONFIG_SPRD_CODEC_USE_INT
193 struct completion completion_hp_pop;
196 struct completion completion_dac_mute;
200 /* codec local power suppliy */
201 static struct sprd_codec_power_suppliy {
205 atomic_t ldo_refcount;
206 int audio_ldo_open_ok;
209 static inline char *_2str(int enable)
211 return enable ? "enable" : "disable";
214 #define SPRD_CODEC_PA_SW_AOL (BIT(0))
215 #define SPRD_CODEC_PA_SW_EAR (BIT(1))
216 #define SPRD_CODEC_PA_SW_FUN (SPRD_CODEC_PA_SW_AOL | SPRD_CODEC_PA_SW_EAR)
217 static int sprd_codec_fun = 0;
218 DEFINE_SPINLOCK(sprd_codec_fun_lock);
220 static void sprd_codec_set_fun(int fun)
222 spin_lock(&sprd_codec_fun_lock);
223 sprd_codec_fun |= fun;
224 spin_unlock(&sprd_codec_fun_lock);
227 static void sprd_codec_clr_fun(int fun)
229 spin_lock(&sprd_codec_fun_lock);
230 sprd_codec_fun &= ~fun;
231 spin_unlock(&sprd_codec_fun_lock);
234 static int sprd_codec_test_fun(int fun)
237 spin_lock(&sprd_codec_fun_lock);
238 ret = sprd_codec_fun & fun;
239 spin_unlock(&sprd_codec_fun_lock);
243 static unsigned int sprd_codec_read(struct snd_soc_codec *codec,
246 if (IS_SPRD_CODEC_AP_RANG(reg)) {
247 return arch_audio_codec_read(reg);
248 } else if (IS_SPRD_CODEC_DP_RANG(reg)) {
249 return __raw_readl(reg);
251 sprd_codec_dbg("read the register is not codec's reg = 0x%x\n", reg);
255 static int sprd_codec_write(struct snd_soc_codec *codec, unsigned int reg,
258 sprd_codec_dbg("reg = 0x%08x val = 0x%08x\n", reg, val);
259 if (IS_SPRD_CODEC_AP_RANG(reg)) {
260 return arch_audio_codec_write(reg, val);
261 } else if (IS_SPRD_CODEC_DP_RANG(reg)) {
262 return __raw_writel(val, reg);
264 sprd_codec_dbg("write the register is not codec's reg = 0x%x\n", reg);
268 static inline unsigned int snd_soc_read(struct snd_soc_codec *codec,
271 return sprd_codec_read(codec, reg);
274 static inline unsigned int snd_soc_write(struct snd_soc_codec *codec,
275 unsigned int reg, unsigned int val)
277 return sprd_codec_write(codec, reg, val);
280 static struct sprd_codec_priv s_sprd_codec_priv = { 0 };
282 static struct snd_soc_codec s_sprd_codec = {
283 .read = sprd_codec_read,
284 .write = sprd_codec_write,
285 .sprd_codec = &s_sprd_codec_priv,
289 * snd_soc_update_bits - update codec register bits
290 * @codec: audio codec
291 * @reg: codec register
292 * @mask: register mask
295 * Writes new register value.
297 * Returns 1 for change, 0 for no change, or negative error code.
299 static int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned int reg,
300 unsigned int mask, unsigned int value)
303 unsigned int old, new;
306 ret = snd_soc_read(codec, reg);
311 new = (old & ~mask) | value;
314 ret = snd_soc_write(codec, reg, new);
322 static void sprd_codec_wait(u32 wait_time)
324 udelay(wait_time * 1000);
327 static unsigned int sprd_codec_read(struct snd_soc_codec *codec,
329 static void sprd_codec_print_regs(struct snd_soc_codec *codec)
332 pr_warn("sprd_codec register digital part\n");
333 for (reg = SPRD_CODEC_DP_BASE; reg < SPRD_CODEC_DP_END; reg += 0x10) {
334 pr_warn("0x%04x | 0x%04x 0x%04x 0x%04x 0x%04x\n",
335 (reg - SPRD_CODEC_DP_BASE)
336 , sprd_codec_read(codec, reg + 0x00)
337 , sprd_codec_read(codec, reg + 0x04)
338 , sprd_codec_read(codec, reg + 0x08)
339 , sprd_codec_read(codec, reg + 0x0C)
342 pr_warn("sprd_codec register analog part\n");
343 for (reg = SPRD_CODEC_AP_BASE; reg < SPRD_CODEC_AP_END; reg += 0x10) {
344 pr_warn("0x%04x | 0x%04x 0x%04x 0x%04x 0x%04x\n",
345 (reg - SPRD_CODEC_AP_BASE)
346 , sprd_codec_read(codec, reg + 0x00)
347 , sprd_codec_read(codec, reg + 0x04)
348 , sprd_codec_read(codec, reg + 0x08)
349 , sprd_codec_read(codec, reg + 0x0C)
354 static inline void sprd_codec_vcm_v_sel(int v_sel)
358 sprd_codec_dbg("Entering %s set %d\n", __func__, v_sel);
359 mask = VCM_V_MASK << VCM_V;
360 val = (v_sel << VCM_V) & mask;
361 arch_audio_codec_write_mask(PMUR4_PMUR3, val, mask);
364 static int sprd_codec_pga_spk_set(struct snd_soc_codec *codec, int pgaval)
368 val = (pgaval & 0xF) << 4;
369 return snd_soc_update_bits(codec, SOC_REG(reg), 0xF0, val);
372 static int sprd_codec_pga_spkr_set(struct snd_soc_codec *codec, int pgaval)
377 return snd_soc_update_bits(codec, SOC_REG(reg), 0x0F, val);
380 static int sprd_codec_pga_hpl_set(struct snd_soc_codec *codec, int pgaval)
384 val = (pgaval & 0xF) << 4;
385 return snd_soc_update_bits(codec, SOC_REG(reg), 0xF0, val);
388 static int sprd_codec_pga_hpr_set(struct snd_soc_codec *codec, int pgaval)
393 return snd_soc_update_bits(codec, SOC_REG(reg), 0x0F, val);
396 static int sprd_codec_pga_ear_set(struct snd_soc_codec *codec, int pgaval)
400 val = ((pgaval & 0xF) << 12);
401 return snd_soc_update_bits(codec, SOC_REG(reg), 0xF000, val);
404 static int sprd_codec_pga_adcl_set(struct snd_soc_codec *codec, int pgaval)
409 return snd_soc_update_bits(codec, SOC_REG(reg), 0x3F, val);
412 static int sprd_codec_pga_adcr_set(struct snd_soc_codec *codec, int pgaval)
416 val = (pgaval & 0x3F) << 8;
417 return snd_soc_update_bits(codec, SOC_REG(reg), 0x3F00, val);
420 static int sprd_codec_pga_dacl_set(struct snd_soc_codec *codec, int pgaval)
424 val = (pgaval & 0x07) << 12;
425 return snd_soc_update_bits(codec, SOC_REG(reg), 0x7000, val);
428 static int sprd_codec_pga_dacr_set(struct snd_soc_codec *codec, int pgaval)
432 val = (pgaval & 0x07) << 8;
433 return snd_soc_update_bits(codec, SOC_REG(reg), 0x0700, val);
436 static int sprd_codec_pga_mic_set(struct snd_soc_codec *codec, int pgaval)
440 val = (pgaval & 0x03) << 6;
441 return snd_soc_update_bits(codec, SOC_REG(reg), 0xC0, val);
444 static int sprd_codec_pga_auxmic_set(struct snd_soc_codec *codec, int pgaval)
448 val = (pgaval & 0x03) << 4;
449 return snd_soc_update_bits(codec, SOC_REG(reg), 0x30, val);
452 static int sprd_codec_pga_headmic_set(struct snd_soc_codec *codec, int pgaval)
456 val = (pgaval & 0x03) << 2;
457 return snd_soc_update_bits(codec, SOC_REG(reg), 0x0C, val);
460 static int sprd_codec_pga_ailr_set(struct snd_soc_codec *codec, int pgaval)
465 return snd_soc_update_bits(codec, SOC_REG(reg), 0x03, val);
468 static struct sprd_codec_pga sprd_codec_pga_cfg[SPRD_CODEC_PGA_MAX] = {
469 {sprd_codec_pga_spk_set, 0},
470 {sprd_codec_pga_spkr_set, 0},
471 {sprd_codec_pga_hpl_set, 0},
472 {sprd_codec_pga_hpr_set, 0},
473 {sprd_codec_pga_ear_set, 0},
475 {sprd_codec_pga_adcl_set, 0},
476 {sprd_codec_pga_adcr_set, 0},
478 {sprd_codec_pga_dacl_set, 0},
479 {sprd_codec_pga_dacr_set, 0},
480 {sprd_codec_pga_mic_set, 0},
481 {sprd_codec_pga_auxmic_set, 0},
482 {sprd_codec_pga_headmic_set, 0},
483 {sprd_codec_pga_ailr_set, 0},
484 {sprd_codec_pga_ailr_set, 0},
489 static int sprd_codec_is_ai_enable(struct snd_soc_codec *codec)
491 return ! !(snd_soc_read(codec, AAICR2_AAICR1) &
492 (BIT(AIL_ADCR) | BIT(AIL_ADCL) | BIT(AIR_ADCR) |
496 static int ailadcl_set(struct snd_soc_codec *codec, int on)
498 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
499 return snd_soc_update_bits(codec, SOC_REG(AAICR2_AAICR1), BIT(AIL_ADCL),
503 static int ailadcr_set(struct snd_soc_codec *codec, int on)
505 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
506 return snd_soc_update_bits(codec, SOC_REG(AAICR2_AAICR1), BIT(AIL_ADCR),
510 static int airadcl_set(struct snd_soc_codec *codec, int on)
512 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
513 return snd_soc_update_bits(codec, SOC_REG(AAICR2_AAICR1), BIT(AIR_ADCL),
517 static int airadcr_set(struct snd_soc_codec *codec, int on)
519 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
520 return snd_soc_update_bits(codec, SOC_REG(AAICR2_AAICR1), BIT(AIR_ADCR),
524 static int mainmicadcl_set(struct snd_soc_codec *codec, int on)
526 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
527 return snd_soc_update_bits(codec, SOC_REG(AAICR2_AAICR1), BIT(MIC_ADCL),
531 static int mainmicadcr_set(struct snd_soc_codec *codec, int on)
533 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
534 return snd_soc_update_bits(codec, SOC_REG(AAICR2_AAICR1), BIT(MIC_ADCR),
538 static int auxmicadcl_set(struct snd_soc_codec *codec, int on)
540 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
541 return snd_soc_update_bits(codec, SOC_REG(AAICR2_AAICR1),
542 BIT(AUXMIC_ADCL), on << AUXMIC_ADCL);
545 static int auxmicadcr_set(struct snd_soc_codec *codec, int on)
547 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
548 return snd_soc_update_bits(codec, SOC_REG(AAICR2_AAICR1),
549 BIT(AUXMIC_ADCR), on << AUXMIC_ADCR);
552 static int hpmicadcl_set(struct snd_soc_codec *codec, int on)
554 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
555 return snd_soc_update_bits(codec, SOC_REG(AAICR2_AAICR1),
556 BIT(HEADMIC_ADCL), on << HEADMIC_ADCL);
559 static int hpmicadcr_set(struct snd_soc_codec *codec, int on)
561 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
562 return snd_soc_update_bits(codec, SOC_REG(AAICR2_AAICR1),
563 BIT(HEADMIC_ADCR), on << HEADMIC_ADCR);
568 static int daclhpl_set(struct snd_soc_codec *codec, int on)
570 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
571 return snd_soc_update_bits(codec, SOC_REG(DAOCR3_DAOCR1),
572 BIT(DACL_P_HPL), on << DACL_P_HPL);
575 static int daclhpr_set(struct snd_soc_codec *codec, int on)
577 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
578 return snd_soc_update_bits(codec, SOC_REG(DAOCR3_DAOCR1),
579 BIT(DACL_N_HPR), on << DACL_N_HPR);
582 static int dacrhpl_set(struct snd_soc_codec *codec, int on)
584 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
585 return snd_soc_update_bits(codec, SOC_REG(DAOCR3_DAOCR1),
586 BIT(DACR_P_HPL), on << DACR_P_HPL);
589 static int dacrhpr_set(struct snd_soc_codec *codec, int on)
591 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
592 return snd_soc_update_bits(codec, SOC_REG(DAOCR3_DAOCR1),
593 BIT(DACR_P_HPR), on << DACR_P_HPR);
596 static int adclhpl_set(struct snd_soc_codec *codec, int on)
598 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
599 return snd_soc_update_bits(codec, SOC_REG(DAOCR3_DAOCR1),
600 BIT(ADCL_P_HPL), on << ADCL_P_HPL);
603 static int adclhpr_set(struct snd_soc_codec *codec, int on)
605 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
606 return snd_soc_update_bits(codec, SOC_REG(DAOCR3_DAOCR1),
607 BIT(ADCL_N_HPR), on << ADCL_N_HPR);
610 static int adcrhpl_set(struct snd_soc_codec *codec, int on)
612 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
613 return snd_soc_update_bits(codec, SOC_REG(DAOCR3_DAOCR1),
614 BIT(ADCR_P_HPL), on << ADCR_P_HPL);
617 static int adcrhpr_set(struct snd_soc_codec *codec, int on)
619 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
620 return snd_soc_update_bits(codec, SOC_REG(DAOCR3_DAOCR1),
621 BIT(ADCR_P_HPR), on << ADCR_P_HPR);
626 static int daclspkl_set(struct snd_soc_codec *codec, int on)
628 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
629 return snd_soc_update_bits(codec, SOC_REG(DAOCR2), BIT(DACL_AOL),
633 static int dacrspkl_set(struct snd_soc_codec *codec, int on)
635 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
636 return snd_soc_update_bits(codec, SOC_REG(DAOCR2), BIT(DACR_AOL),
640 static int adclspkl_set(struct snd_soc_codec *codec, int on)
642 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
643 return snd_soc_update_bits(codec, SOC_REG(DAOCR2), BIT(ADCL_AOL),
647 static int adcrspkl_set(struct snd_soc_codec *codec, int on)
649 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
650 return snd_soc_update_bits(codec, SOC_REG(DAOCR2), BIT(ADCR_AOL),
656 static int daclspkr_set(struct snd_soc_codec *codec, int on)
658 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
659 return snd_soc_update_bits(codec, SOC_REG(DAOCR2), BIT(DACL_AOR),
663 static int dacrspkr_set(struct snd_soc_codec *codec, int on)
665 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
666 return snd_soc_update_bits(codec, SOC_REG(DAOCR2), BIT(DACR_AOR),
670 static int adclspkr_set(struct snd_soc_codec *codec, int on)
672 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
673 return snd_soc_update_bits(codec, SOC_REG(DAOCR2), BIT(ADCL_AOR),
677 static int adcrspkr_set(struct snd_soc_codec *codec, int on)
679 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
680 return snd_soc_update_bits(codec, SOC_REG(DAOCR2), BIT(ADCR_AOR),
686 static int daclear_set(struct snd_soc_codec *codec, int on)
688 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
689 return snd_soc_update_bits(codec, SOC_REG(DAOCR3_DAOCR1), BIT(DACL_EAR),
693 static sprd_codec_mixer_set mixer_setting[SPRD_CODEC_MIXER_MAX] = {
695 ailadcl_set, ailadcr_set,
696 airadcl_set, airadcr_set,
697 mainmicadcl_set, mainmicadcr_set,
698 auxmicadcl_set, auxmicadcr_set,
699 hpmicadcl_set, hpmicadcr_set,
701 daclhpl_set, daclhpr_set,
702 dacrhpl_set, dacrhpr_set,
703 adclhpl_set, adclhpr_set,
704 adcrhpl_set, adcrhpr_set,
706 daclspkl_set, daclspkr_set,
707 dacrspkl_set, dacrspkr_set,
708 adclspkl_set, adclspkr_set,
709 adcrspkl_set, adcrspkr_set,
714 int sprd_codec_digital_loop(int enable)
716 struct snd_soc_codec *codec = &s_sprd_codec;
717 int mask = BIT(AUDIFA_ADIE_LOOP_EN);
719 snd_soc_update_bits(codec, SOC_REG(AUDIF_ENB), mask, mask);
720 arch_audio_codec_loop_enable();
722 snd_soc_update_bits(codec, SOC_REG(AUDIF_ENB), mask, 0);
723 arch_audio_codec_loop_disable();
728 /* DO NOT USE THIS FUNCTION */
729 static inline void __sprd_codec_pa_sw_en(int on)
733 mask = BIT(PA_SW_EN);
735 arch_audio_codec_write_mask(PMUR2_PMUR1, val, mask);
738 DEFINE_SPINLOCK(sprd_codec_pa_sw_lock);
739 static inline void sprd_codec_pa_sw_set(int fun)
741 sprd_codec_dbg("Entering %s fun 0x%08x\n", __func__, fun);
742 spin_lock(&sprd_codec_pa_sw_lock);
743 sprd_codec_set_fun(fun);
744 __sprd_codec_pa_sw_en(1);
745 spin_unlock(&sprd_codec_pa_sw_lock);
748 static inline void sprd_codec_pa_sw_clr(int fun)
750 sprd_codec_dbg("Entering %s fun 0x%08x\n", __func__, fun);
751 spin_lock(&sprd_codec_pa_sw_lock);
752 sprd_codec_clr_fun(fun);
753 if (!sprd_codec_test_fun(SPRD_CODEC_PA_SW_FUN))
754 __sprd_codec_pa_sw_en(0);
755 spin_unlock(&sprd_codec_pa_sw_lock);
760 static inline void sprd_codec_pa_d_en(int on)
764 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
767 arch_audio_codec_write_mask(DCR2_DCR1, val, mask);
770 static inline void sprd_codec_pa_demi_en(int on)
774 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
775 mask = BIT(PA_DEMI_EN);
777 arch_audio_codec_write_mask(DCR2_DCR1, val, mask);
779 mask = BIT(DRV_OCP_AOL_PD) | BIT(DRV_OCP_AOR_PD);
781 arch_audio_codec_write_mask(DCR4_DCR3, val, mask);
784 static inline void sprd_codec_pa_ldo_en(int on)
788 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
789 mask = BIT(PA_LDO_EN);
791 arch_audio_codec_write_mask(PMUR2_PMUR1, val, mask);
793 sprd_codec_pa_sw_clr(SPRD_CODEC_PA_SW_AOL);
797 static inline void sprd_codec_pa_ldo_v_sel(int v_sel)
801 sprd_codec_dbg("Entering %s set %d\n", __func__, v_sel);
802 mask = PA_LDO_V_MASK << PA_LDO_V;
803 val = (v_sel << PA_LDO_V) & mask;
804 arch_audio_codec_write_mask(PMUR6_PMUR5, val, mask);
807 static inline void sprd_codec_pa_dtri_f_sel(int f_sel)
811 sprd_codec_dbg("Entering %s set %d\n", __func__, f_sel);
812 mask = PA_DTRI_F_MASK << PA_DTRI_F;
813 val = (f_sel << PA_DTRI_F) & mask;
814 arch_audio_codec_write_mask(DCR2_DCR1, val, mask);
817 static inline void sprd_codec_pa_en(int on)
821 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
822 spin_lock(&sprd_codec_pa_sw_lock);
827 if (!sprd_codec_test_fun(SPRD_CODEC_PA_SW_FUN))
828 mask = BIT(PA_EN) | BIT(PA_SW_EN) | BIT(PA_LDO_EN);
830 mask = BIT(PA_EN) | BIT(PA_LDO_EN);
833 arch_audio_codec_write_mask(PMUR2_PMUR1, val, mask);
834 spin_unlock(&sprd_codec_pa_sw_lock);
837 static inline void sprd_codec_inter_pa_init(void)
839 inter_pa.setting.LDO_V_sel = 0x03;
840 inter_pa.setting.DTRI_F_sel = 0x01;
843 int sprd_inter_speaker_pa(int on)
845 pr_info("inter PA switch %s\n", on ? "ON" : "OFF");
846 mutex_lock(&inter_pa_mutex);
848 sprd_codec_pa_d_en(inter_pa.setting.is_classD_mode);
849 sprd_codec_pa_demi_en(inter_pa.setting.is_DEMI_mode);
850 sprd_codec_pa_ldo_en(inter_pa.setting.is_LDO_mode);
851 if (inter_pa.setting.is_LDO_mode) {
852 if (inter_pa.setting.is_auto_LDO_mode) {
853 /* sprd_codec_pa_ldo_v_sel(1); */
855 sprd_codec_pa_ldo_v_sel(inter_pa.setting.
859 sprd_codec_pa_dtri_f_sel(inter_pa.setting.DTRI_F_sel);
865 sprd_codec_pa_ldo_en(0);
867 mutex_unlock(&inter_pa_mutex);
871 EXPORT_SYMBOL(sprd_inter_speaker_pa);
873 static inline void sprd_codec_hp_pa_lpw(int on)
877 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
878 mask = BIT(AUDIO_CHP_LPW);
880 arch_audio_codec_write_mask(DCR8_DCR7, val, mask);
883 static inline void sprd_codec_hp_pa_mode(int on)
887 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
888 mask = BIT(AUDIO_CHP_MODE);
890 arch_audio_codec_write_mask(DCR8_DCR7, val, mask);
893 static inline void sprd_codec_hp_pa_osc(int osc)
897 sprd_codec_dbg("Entering %s set %d\n", __func__, osc);
898 mask = AUDIO_CHP_OSC_MASK << AUDIO_CHP_OSC;
899 val = (osc << AUDIO_CHP_OSC) & mask;
900 arch_audio_codec_write_mask(DCR8_DCR7, val, mask);
903 static inline void sprd_codec_hp_pa_ref_en(int on)
907 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
908 mask = BIT(AUDIO_CHP_REF_EN);
910 arch_audio_codec_write_mask(DCR8_DCR7, val, mask);
913 static inline void sprd_codec_hp_pa_en(int on)
917 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
918 mask = BIT(AUDIO_CHP_EN);
920 arch_audio_codec_write_mask(DCR8_DCR7, val, mask);
923 static inline void sprd_codec_hp_pa_hpl_en(int on)
927 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
928 mask = BIT(AUDIO_CHP_HPL_EN);
930 arch_audio_codec_write_mask(DCR8_DCR7, val, mask);
933 static inline void sprd_codec_hp_pa_hpr_en(int on)
937 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
938 mask = BIT(AUDIO_CHP_HPR_EN);
940 arch_audio_codec_write_mask(DCR8_DCR7, val, mask);
943 static inline void sprd_codec_hp_pa_hpl_mute(int on)
947 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
948 mask = BIT(AUDIO_CHP_LMUTE);
950 arch_audio_codec_write_mask(DCR8_DCR7, val, mask);
953 static inline void sprd_codec_hp_pa_hpr_mute(int on)
957 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
958 mask = BIT(AUDIO_CHP_RMUTE);
960 arch_audio_codec_write_mask(DCR8_DCR7, val, mask);
963 static inline void sprd_codec_inter_hp_pa_init(void)
965 inter_hp_pa.setting.class_g_osc = 0x01;
968 int sprd_inter_headphone_pa(int on)
970 pr_info("inter HP PA switch %s\n", on ? "ON" : "OFF");
971 mutex_lock(&inter_hp_pa_mutex);
973 LDO_TurnOnLDO(CLASS_G_LDO_ID);
974 sprd_codec_hp_pa_lpw(inter_hp_pa.setting.class_g_low_power);
975 sprd_codec_hp_pa_mode(inter_hp_pa.setting.class_g_mode);
976 sprd_codec_hp_pa_osc(inter_hp_pa.setting.class_g_osc);
977 sprd_codec_hp_pa_hpl_en(1);
978 sprd_codec_hp_pa_hpr_en(1);
979 sprd_codec_hp_pa_ref_en(1);
980 sprd_codec_hp_pa_en(1);
984 sprd_codec_hp_pa_en(0);
985 sprd_codec_hp_pa_ref_en(0);
986 sprd_codec_hp_pa_hpl_en(0);
987 sprd_codec_hp_pa_hpr_en(0);
988 LDO_TurnOffLDO(CLASS_G_LDO_ID);
990 mutex_unlock(&inter_hp_pa_mutex);
994 EXPORT_SYMBOL(sprd_inter_headphone_pa);
996 /* mic bias external */
998 static inline void sprd_codec_mic_bias_en(int on)
1002 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
1003 mask = BIT(MICBIAS_EN);
1004 val = on ? mask : 0;
1005 arch_audio_codec_write_mask(PMUR4_PMUR3, val, mask);
1008 static inline void sprd_codec_auxmic_bias_en(int on)
1012 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
1013 mask = BIT(AUXMICBIAS_EN);
1014 val = on ? mask : 0;
1015 arch_audio_codec_write_mask(PMUR4_PMUR3, val, mask);
1018 static inline void sprd_codec_headmic_bias_en(int on)
1022 sprd_codec_dbg("Entering %s set %d\n", __func__, on);
1023 mask = BIT(HEADMICBIAS_EN);
1024 val = on ? mask : 0;
1025 arch_audio_codec_write_mask(PMUR2_PMUR1, val, mask);
1028 static int sprd_codec_set_sample_rate(struct snd_soc_codec *codec, int rate,
1029 int mask, int shift)
1033 snd_soc_update_bits(codec, SOC_REG(AUD_DAC_CTL), mask,
1034 SPRD_CODEC_RATE_8000 << shift);
1037 snd_soc_update_bits(codec, SOC_REG(AUD_DAC_CTL), mask,
1038 SPRD_CODEC_RATE_11025 << shift);
1041 snd_soc_update_bits(codec, SOC_REG(AUD_DAC_CTL), mask,
1042 SPRD_CODEC_RATE_16000 << shift);
1045 snd_soc_update_bits(codec, SOC_REG(AUD_DAC_CTL), mask,
1046 SPRD_CODEC_RATE_22050 << shift);
1049 snd_soc_update_bits(codec, SOC_REG(AUD_DAC_CTL), mask,
1050 SPRD_CODEC_RATE_32000 << shift);
1053 snd_soc_update_bits(codec, SOC_REG(AUD_DAC_CTL), mask,
1054 SPRD_CODEC_RATE_44100 << shift);
1057 snd_soc_update_bits(codec, SOC_REG(AUD_DAC_CTL), mask,
1058 SPRD_CODEC_RATE_48000 << shift);
1061 snd_soc_update_bits(codec, SOC_REG(AUD_DAC_CTL), mask,
1062 SPRD_CODEC_RATE_96000 << shift);
1065 pr_err("sprd_codec not supports rate %d\n", rate);
1071 static int sprd_codec_set_ad_sample_rate(struct snd_soc_codec *codec, int rate,
1072 int mask, int shift)
1077 pr_err("sprd_codec not supports ad rate %d\n", rate);
1079 snd_soc_update_bits(codec, SOC_REG(AUD_ADC_CTL), mask, set << shift);
1083 static int sprd_codec_sample_rate_setting(struct sprd_codec_priv *sprd_codec)
1085 if (sprd_codec->ad_sample_val) {
1086 sprd_codec_set_ad_sample_rate(sprd_codec->codec,
1087 sprd_codec->ad_sample_val, 0x0F,
1089 #ifdef CONFIG_SPRD_CODEC_DMIC
1090 /*set adc1(dmic) sample rate */
1091 sprd_codec_set_ad_sample_rate(sprd_codec->codec,
1092 sprd_codec->ad_sample_val, 0xF0,
1096 if (sprd_codec->da_sample_val) {
1097 sprd_codec_set_sample_rate(sprd_codec->codec,
1098 sprd_codec->da_sample_val, 0x0F, 0);
1103 static int sprd_codec_update_bits(struct snd_soc_codec *codec,
1104 unsigned int reg, unsigned int mask,
1108 return arch_audio_codec_write_mask(reg, value, mask);
1110 return snd_soc_update_bits(codec, reg, mask, value);
1114 static int sprd_codec_ldo_on(struct sprd_codec_priv *sprd_codec)
1116 struct snd_soc_codec *codec = 0;
1117 sprd_codec_dbg("Entering %s\n", __func__);
1119 atomic_inc(&sprd_codec_power.ldo_refcount);
1120 if (atomic_read(&sprd_codec_power.ldo_refcount) == 1) {
1121 sprd_codec_dbg("ldo on!\n");
1123 codec = sprd_codec->codec;
1125 arch_audio_codec_switch(AUDIO_TO_AP_ARM_CTRL);
1126 arch_audio_codec_analog_reg_enable();
1127 arch_audio_codec_enable();
1128 arch_audio_codec_reset();
1129 /* sprd_codec_vcm_v_sel(0); */
1131 sprd_codec_update_bits(codec, SOC_REG(PMUR4_PMUR3),
1132 BIT(BG_IBIAS_EN), BIT(BG_IBIAS_EN));
1133 sprd_codec_update_bits(codec, SOC_REG(PMUR4_PMUR3), BIT(BG_EN),
1135 sprd_codec_update_bits(codec, SOC_REG(PMUR4_PMUR3), BIT(VCM_EN),
1137 sprd_codec_update_bits(codec, SOC_REG(PMUR4_PMUR3),
1138 BIT(VCM_BUF_EN), BIT(VCM_BUF_EN));
1139 sprd_codec_update_bits(codec, SOC_REG(PMUR2_PMUR1), BIT(VB_EN),
1141 sprd_codec_update_bits(codec, SOC_REG(PMUR2_PMUR1), BIT(VBO_EN),
1145 sprd_codec_wait(SPRD_CODEC_LDO_WAIT_TIME);
1149 sprd_codec_dbg("Leaving %s\n", __func__);
1153 static int sprd_codec_ldo_off(struct sprd_codec_priv *sprd_codec)
1155 struct snd_soc_codec *codec = 0;
1156 sprd_codec_dbg("Entering %s\n", __func__);
1158 if (atomic_dec_and_test(&sprd_codec_power.ldo_refcount)) {
1160 codec = sprd_codec->codec;
1162 sprd_codec_update_bits(codec, SOC_REG(PMUR4_PMUR3), BIT(VCM_EN),
1164 sprd_codec_wait(SPRD_CODEC_LDO_VCM_TIME);
1165 sprd_codec_update_bits(codec, SOC_REG(PMUR4_PMUR3),
1166 BIT(VCM_BUF_EN), 0);
1167 sprd_codec_update_bits(codec, SOC_REG(PMUR2_PMUR1), BIT(VB_EN),
1169 sprd_codec_update_bits(codec, SOC_REG(PMUR2_PMUR1), BIT(VBO_EN),
1171 sprd_codec_update_bits(codec, SOC_REG(PMUR4_PMUR3),
1172 BIT(BG_IBIAS_EN), 0);
1173 sprd_codec_update_bits(codec, SOC_REG(PMUR4_PMUR3), BIT(BG_EN),
1176 arch_audio_codec_reset();
1177 arch_audio_codec_disable();
1178 arch_audio_codec_analog_reg_disable();
1179 sprd_codec_dbg("ldo off!\n");
1182 sprd_codec_dbg("Leaving %s\n", __func__);
1186 static int sprd_codec_ldo_control(int on)
1189 return sprd_codec_ldo_on(0);
1191 return sprd_codec_ldo_off(0);
1195 static void sprd_codec_mic_delay_worker(void)
1197 int on = atomic_read(&sprd_codec_power.mic_on) > 0;
1198 sprd_codec_ldo_control(on);
1199 sprd_codec_mic_bias_en(on);
1202 static void sprd_codec_auxmic_delay_worker(void)
1204 int on = atomic_read(&sprd_codec_power.auxmic_on) > 0;
1205 sprd_codec_ldo_control(on);
1206 sprd_codec_auxmic_bias_en(on);
1209 static void sprd_codec_headmic_delay_worker(void)
1211 int on = atomic_read(&sprd_codec_power.headmic_on) > 0;
1212 sprd_codec_ldo_control(on);
1213 sprd_codec_headmic_bias_en(on);
1216 static int sprd_codec_mic_bias_inter(int on, atomic_t * v)
1222 if (atomic_read(v) > 0) {
1230 int sprd_codec_mic_bias_control(int on)
1232 if (sprd_codec_mic_bias_inter(on, &sprd_codec_power.mic_on)) {
1233 sprd_codec_mic_delay_worker();
1238 EXPORT_SYMBOL(sprd_codec_mic_bias_control);
1240 int sprd_codec_auxmic_bias_control(int on)
1242 if (sprd_codec_mic_bias_inter(on, &sprd_codec_power.auxmic_on)) {
1243 sprd_codec_auxmic_delay_worker();
1248 EXPORT_SYMBOL(sprd_codec_auxmic_bias_control);
1250 int sprd_codec_headmic_bias_control(int on)
1252 if (sprd_codec_mic_bias_inter(on, &sprd_codec_power.headmic_on)) {
1253 sprd_codec_headmic_delay_worker();
1258 EXPORT_SYMBOL(sprd_codec_headmic_bias_control);
1260 static int sprd_codec_open(struct snd_soc_codec *codec)
1262 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
1265 sprd_codec_dbg("Entering %s\n", __func__);
1267 sprd_codec_sample_rate_setting(sprd_codec);
1269 sprd_codec_dbg("Leaving %s\n", __func__);
1273 static void sprd_codec_power_enable(struct snd_soc_codec *codec)
1275 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
1278 atomic_inc(&sprd_codec->power_refcount);
1279 if (atomic_read(&sprd_codec->power_refcount) == 1) {
1280 sprd_codec_dbg("Entering %s\n", __func__);
1281 ret = sprd_codec_ldo_on(sprd_codec);
1283 pr_err("sprd_codec open ldo error %d\n", ret);
1284 sprd_codec_open(codec);
1285 sprd_codec_dbg("Leaving %s\n", __func__);
1289 static void sprd_codec_power_disable(struct snd_soc_codec *codec)
1291 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
1293 if (atomic_dec_and_test(&sprd_codec->power_refcount)) {
1294 sprd_codec_dbg("Entering %s\n", __func__);
1295 sprd_codec_ldo_off(sprd_codec);
1296 sprd_codec_dbg("Leaving %s\n", __func__);
1300 static int analog_power_enable(int enable)
1302 struct snd_soc_codec *codec = &s_sprd_codec;
1303 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
1306 sprd_codec_dbg("Entering %s is %s\n", __func__, _2str(enable));
1309 atomic_inc(&sprd_codec->analog_power_refcount);
1310 if (atomic_read(&sprd_codec->analog_power_refcount) == 1) {
1311 sprd_codec_power_enable(codec);
1314 if (atomic_dec_and_test(&sprd_codec->analog_power_refcount)) {
1315 sprd_codec_power_disable(codec);
1322 static int digital_power_enable(int enable)
1325 struct snd_soc_codec *codec = &s_sprd_codec;
1326 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
1328 sprd_codec_dbg("Entering %s is %s\n", __func__, _2str(enable));
1331 atomic_inc(&sprd_codec->digital_power_refcount);
1332 if (atomic_read(&sprd_codec->digital_power_refcount) == 1) {
1333 arch_audio_codec_digital_reg_enable();
1336 if (atomic_dec_and_test(&sprd_codec->digital_power_refcount)) {
1337 arch_audio_codec_digital_reg_disable();
1340 ret = analog_power_enable(enable);
1345 static int adie_dac_enable(int enable)
1347 struct snd_soc_codec *codec = &s_sprd_codec;
1348 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
1351 sprd_codec_dbg("Entering %s is %s\n", __func__, _2str(enable));
1354 atomic_inc(&sprd_codec->adie_dac_refcount);
1355 if (atomic_read(&sprd_codec->adie_dac_refcount) == 1) {
1356 snd_soc_update_bits(codec, SOC_REG(AUDIF_ENB),
1357 BIT(AUDIFA_DACL_EN),
1358 BIT(AUDIFA_DACL_EN));
1359 snd_soc_update_bits(codec, SOC_REG(AUDIF_ENB),
1360 BIT(AUDIFA_DACR_EN),
1361 BIT(AUDIFA_DACR_EN));
1362 pr_info("DAC ON\n");
1365 if (atomic_dec_and_test(&sprd_codec->adie_dac_refcount)) {
1366 snd_soc_update_bits(codec, SOC_REG(AUDIF_ENB),
1367 BIT(AUDIFA_DACL_EN), 0);
1368 snd_soc_update_bits(codec, SOC_REG(AUDIF_ENB),
1369 BIT(AUDIFA_DACR_EN), 0);
1370 pr_info("DAC OFF\n");
1374 sprd_codec_dbg("Leaving %s\n", __func__);
1379 static int adie_adc_enable(int enable)
1381 struct snd_soc_codec *codec = &s_sprd_codec;
1382 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
1385 sprd_codec_dbg("Entering %s is %s\n", __func__, _2str(enable));
1388 atomic_inc(&sprd_codec->adie_adc_refcount);
1389 if (atomic_read(&sprd_codec->adie_adc_refcount) == 1) {
1390 snd_soc_update_bits(codec, SOC_REG(AUDIF_ENB),
1391 BIT(AUDIFA_ADCL_EN),
1392 BIT(AUDIFA_ADCL_EN));
1393 snd_soc_update_bits(codec, SOC_REG(AUDIF_ENB),
1394 BIT(AUDIFA_ADCR_EN),
1395 BIT(AUDIFA_ADCR_EN));
1396 pr_info("ADC ON\n");
1399 if (atomic_dec_and_test(&sprd_codec->adie_adc_refcount)) {
1400 snd_soc_update_bits(codec, SOC_REG(AUDIF_ENB),
1401 BIT(AUDIFA_ADCL_EN), 0);
1402 snd_soc_update_bits(codec, SOC_REG(AUDIF_ENB),
1403 BIT(AUDIFA_ADCR_EN), 0);
1404 pr_info("ADC OFF\n");
1408 sprd_codec_dbg("Leaving %s\n", __func__);
1413 static int _mixer_set_mixer(struct snd_soc_codec *codec, int id, int lr,
1416 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
1417 int reg = ID_FUN(id, lr);
1418 struct sprd_codec_mixer *mixer = &(sprd_codec->mixer[reg]);
1420 mixer->set = mixer_setting[reg];
1421 return mixer->set(codec, mixer->on);
1423 mixer_setting[reg] (codec, 0);
1429 static inline int _mixer_setting(struct snd_soc_codec *codec, int start,
1430 int end, int lr, int try_on)
1433 for (id = start; id < end; id++) {
1434 _mixer_set_mixer(codec, id, lr, try_on);
1439 static inline int _mixer_setting_one(struct snd_soc_codec *codec, int id,
1444 return _mixer_setting(codec, id, id + 1, lr, try_on);
1447 static int dac_digital_power(int enable)
1450 struct snd_soc_codec *codec = &s_sprd_codec;
1451 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
1452 sprd_codec_dbg("%s %s %d\n", __func__, _2str(enable),
1453 atomic_read(&sprd_codec->dac_digital_power_refcount));
1455 atomic_inc(&sprd_codec->dac_digital_power_refcount);
1456 if (atomic_read(&sprd_codec->dac_digital_power_refcount) == 1) {
1457 digital_power_enable(enable);
1458 snd_soc_update_bits(codec, SOC_REG(DACGR_DACR),
1459 BIT(DACL_EN), BIT(DACL_EN));
1460 snd_soc_update_bits(codec, SOC_REG(DACGR_DACR),
1461 BIT(DACR_EN), BIT(DACR_EN));
1462 snd_soc_update_bits(codec, SOC_REG(CCR),
1463 BIT(DAC_CLK_EN), BIT(DAC_CLK_EN));
1464 ret = adie_dac_enable(enable);
1467 if (atomic_dec_and_test
1468 (&sprd_codec->dac_digital_power_refcount)) {
1469 snd_soc_update_bits(codec, SOC_REG(DACGR_DACR),
1471 snd_soc_update_bits(codec, SOC_REG(DACGR_DACR),
1473 snd_soc_update_bits(codec, SOC_REG(CCR),
1474 BIT(DAC_CLK_EN), 0);
1475 ret = adie_dac_enable(enable);
1476 digital_power_enable(enable);
1482 int dacl_digital_switch(int enable)
1485 struct snd_soc_codec *codec = &s_sprd_codec;
1487 ret = dac_digital_power(enable);
1488 snd_soc_update_bits(codec, SOC_REG(DACGR_DACR), BIT(DACL_EN),
1490 snd_soc_update_bits(codec, SOC_REG(AUD_TOP_CTL), BIT(DAC_EN_L),
1493 snd_soc_update_bits(codec, SOC_REG(DACGR_DACR), BIT(DACL_EN),
1495 snd_soc_update_bits(codec, SOC_REG(AUD_TOP_CTL), BIT(DAC_EN_L),
1497 ret = dac_digital_power(enable);
1502 int dacr_digital_switch(int enable)
1505 struct snd_soc_codec *codec = &s_sprd_codec;
1507 ret = dac_digital_power(enable);
1508 snd_soc_update_bits(codec, SOC_REG(DACGR_DACR), BIT(DACR_EN),
1510 snd_soc_update_bits(codec, SOC_REG(AUD_TOP_CTL), BIT(DAC_EN_R),
1513 snd_soc_update_bits(codec, SOC_REG(DACGR_DACR), BIT(DACR_EN),
1515 snd_soc_update_bits(codec, SOC_REG(AUD_TOP_CTL), BIT(DAC_EN_R),
1517 ret = dac_digital_power(enable);
1522 static int dac_power(int enable)
1525 struct snd_soc_codec *codec = &s_sprd_codec;
1526 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
1527 sprd_codec_dbg("%s %s %d\n", __func__, _2str(enable),
1528 atomic_read(&sprd_codec->dac_power_refcount));
1530 atomic_inc(&sprd_codec->dac_power_refcount);
1531 if (atomic_read(&sprd_codec->dac_power_refcount) == 1) {
1532 analog_power_enable(enable);
1533 snd_soc_update_bits(codec, SOC_REG(CCR),
1534 BIT(DRV_CLK_EN), BIT(DRV_CLK_EN));
1537 if (atomic_dec_and_test(&sprd_codec->dac_power_refcount)) {
1538 snd_soc_update_bits(codec, SOC_REG(CCR),
1539 BIT(DRV_CLK_EN), 0);
1540 analog_power_enable(enable);
1546 #ifdef CONFIG_SPRD_CODEC_USE_INT
1547 #ifndef CONFIG_CODEC_NO_HP_POP
1548 static void sprd_codec_hp_pop_irq_enable(struct snd_soc_codec *codec)
1550 int mask = BIT(AUDIO_POP_IRQ);
1551 snd_soc_update_bits(codec, SOC_REG(AUDIF_INT_CLR), mask, mask);
1552 snd_soc_update_bits(codec, SOC_REG(AUDIF_INT_EN), mask, mask);
1556 static irqreturn_t sprd_codec_ap_irq(int irq, void *dev_id)
1559 struct sprd_codec_priv *sprd_codec = dev_id;
1560 struct snd_soc_codec *codec = sprd_codec->codec;
1561 mask = snd_soc_read(codec, AUDIF_INT_MASK);
1562 sprd_codec_dbg("hp pop irq mask = 0x%x\n", mask);
1563 if (BIT(AUDIO_POP_IRQ) & mask) {
1564 mask = BIT(AUDIO_POP_IRQ);
1565 snd_soc_update_bits(codec, SOC_REG(AUDIF_INT_EN), mask, 0);
1566 complete(&sprd_codec->completion_hp_pop);
1572 #ifndef CONFIG_CODEC_NO_HP_POP
1573 static inline int is_hp_pop_compelet(struct snd_soc_codec *codec)
1576 val = snd_soc_read(codec, IFR2_IFR1);
1577 val = (val >> HP_POP_FLG) & HP_POP_FLG_MASK;
1578 sprd_codec_dbg("HP POP= 0x%x\n", val);
1579 return HP_POP_FLG_NEAR_CMP == val;
1582 static inline int hp_pop_wait_for_compelet(struct snd_soc_codec *codec)
1584 #ifdef CONFIG_SPRD_CODEC_USE_INT
1586 int hp_pop_complete;
1587 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
1588 hp_pop_complete = msecs_to_jiffies(SPRD_CODEC_HP_POP_TIMEOUT);
1589 for (i = 0; i < 2; i++) {
1590 sprd_codec_dbg("hp pop %d irq enable\n", i);
1591 sprd_codec_hp_pop_irq_enable(codec);
1592 init_completion(&sprd_codec->completion_hp_pop);
1594 wait_for_completion_timeout(&sprd_codec->completion_hp_pop,
1596 sprd_codec_dbg("hp pop %d completion %d\n", i, hp_pop_complete);
1597 if (!hp_pop_complete) {
1598 if (!is_hp_pop_compelet(codec)) {
1599 pr_err("hp pop %d timeout not complete\n", i);
1601 pr_err("hp pop %d timeout but complete\n", i);
1604 /* 01 change to 10 maybe walk to 11 shortly,
1605 so, check it double. */
1607 if (is_hp_pop_compelet(codec)) {
1614 for (times = 0; times < SPRD_CODEC_HP_POP_TIME_COUNT; times++) {
1615 if (is_hp_pop_compelet(codec)) {
1616 /* 01 change to 10 maybe walk to 11 shortly,
1617 so, check it double. */
1619 if (is_hp_pop_compelet(codec)) {
1623 sprd_codec_wait(SPRD_CODEC_HP_POP_TIME_STEP);
1625 pr_err("hp pop wait timeout: times = %d \n", times);
1630 static int hp_pop_enable(int enable)
1632 struct snd_soc_codec *codec = &s_sprd_codec;
1636 sprd_codec_dbg("Entering %s is %s\n", __func__, _2str(enable));
1639 mask = HP_POP_STEP_MASK << HP_POP_STEP;
1640 snd_soc_update_bits(codec, SOC_REG(PNRCR2_PNRCR1), mask,
1641 HP_POP_STEP_2 << HP_POP_STEP);
1642 mask = HP_POP_CTL_MASK << HP_POP_CTL;
1643 snd_soc_update_bits(codec, SOC_REG(PNRCR2_PNRCR1), mask,
1644 HP_POP_CTL_UP << HP_POP_CTL);
1645 sprd_codec_dbg("U PNRCR1 = 0x%x\n",
1646 snd_soc_read(codec, PNRCR2_PNRCR1));
1648 ret = hp_pop_wait_for_compelet(codec);
1649 mask = HP_POP_CTL_MASK << HP_POP_CTL;
1650 snd_soc_update_bits(codec, SOC_REG(PNRCR2_PNRCR1), mask,
1651 HP_POP_CTL_HOLD << HP_POP_CTL);
1652 sprd_codec_dbg("HOLD PNRCR1 = 0x%x\n",
1653 snd_soc_read(codec, PNRCR2_PNRCR1));
1655 mask = HP_POP_STEP_MASK << HP_POP_STEP;
1656 snd_soc_update_bits(codec, SOC_REG(PNRCR2_PNRCR1), mask,
1657 HP_POP_STEP_1 << HP_POP_STEP);
1658 mask = HP_POP_CTL_MASK << HP_POP_CTL;
1659 snd_soc_update_bits(codec, SOC_REG(PNRCR2_PNRCR1), mask,
1660 HP_POP_CTL_DOWN << HP_POP_CTL);
1661 sprd_codec_dbg("D PNRCR1 = 0x%x\n",
1662 snd_soc_read(codec, PNRCR2_PNRCR1));
1664 ret = hp_pop_wait_for_compelet(codec);
1665 mask = HP_POP_CTL_MASK << HP_POP_CTL;
1666 snd_soc_update_bits(codec, SOC_REG(PNRCR2_PNRCR1), mask,
1667 HP_POP_CTL_DIS << HP_POP_CTL);
1668 sprd_codec_dbg("DIS PNRCR1 = 0x%x\n",
1669 snd_soc_read(codec, PNRCR2_PNRCR1));
1672 sprd_codec_dbg("Leaving %s\n", __func__);
1677 #ifndef CONFIG_HP_POP_DELAY_TIME
1678 #define CONFIG_HP_POP_DELAY_TIME (0)
1680 static int hp_pop_enable(int enable)
1683 sprd_codec_dbg("Entering %s is %s wait %dms\n", __func__,
1684 _2str(enable), CONFIG_HP_POP_DELAY_TIME);
1686 sprd_codec_wait(CONFIG_HP_POP_DELAY_TIME);
1688 sprd_codec_dbg("Leaving %s\n", __func__);
1693 static int hp_switch_enable(int enable)
1695 struct snd_soc_codec *codec = &s_sprd_codec;
1696 #ifndef CONFIG_CODEC_NO_HP_POP
1701 sprd_codec_dbg("Entering %s is %s\n", __func__, _2str(enable));
1704 #if 0 /* do not enable the diff function from weifeng.ni */
1705 snd_soc_update_bits(codec, SOC_REG(DCR2_DCR1), BIT(DIFF_EN),
1709 #ifndef CONFIG_CODEC_NO_HP_POP
1710 mask = HP_POP_CTL_MASK << HP_POP_CTL;
1711 snd_soc_update_bits(codec, SOC_REG(PNRCR2_PNRCR1), mask,
1712 HP_POP_CTL_DIS << HP_POP_CTL);
1713 sprd_codec_dbg("DIS(en) PNRCR1 = 0x%x\n",
1714 snd_soc_read(codec, PNRCR2_PNRCR1));
1717 snd_soc_update_bits(codec, SOC_REG(DCR2_DCR1), BIT(DIFF_EN), 0);
1719 #ifndef CONFIG_CODEC_NO_HP_POP
1720 mask = HP_POP_CTL_MASK << HP_POP_CTL;
1721 snd_soc_update_bits(codec, SOC_REG(PNRCR2_PNRCR1), mask,
1722 HP_POP_CTL_HOLD << HP_POP_CTL);
1723 sprd_codec_dbg("HOLD(en) PNRCR1 = 0x%x\n",
1724 snd_soc_read(codec, PNRCR2_PNRCR1));
1728 _mixer_setting(codec, SPRD_CODEC_HP_DACL,
1729 SPRD_CODEC_HP_MIXER_MAX, SPRD_CODEC_LEFT,
1730 snd_soc_read(codec, DCR2_DCR1) & BIT(HPL_EN));
1732 _mixer_setting(codec, SPRD_CODEC_HP_DACL,
1733 SPRD_CODEC_HP_MIXER_MAX, SPRD_CODEC_RIGHT,
1734 snd_soc_read(codec, DCR2_DCR1) & BIT(HPR_EN));
1736 sprd_codec_dbg("Leaving %s\n", __func__);
1741 int hp_switch(int enable)
1744 struct snd_soc_codec *codec = &s_sprd_codec;
1747 #ifndef CONFIG_CODEC_NO_HP_POP
1748 hp_pop_enable(enable);
1750 snd_soc_update_bits(codec, SOC_REG(DCR2_DCR1), BIT(HPL_EN),
1752 snd_soc_update_bits(codec, SOC_REG(DCR2_DCR1), BIT(HPR_EN),
1754 ret = hp_switch_enable(enable);
1755 #ifdef CONFIG_CODEC_NO_HP_POP
1756 hp_pop_enable(enable);
1759 #ifdef CONFIG_CODEC_NO_HP_POP
1760 hp_pop_enable(enable);
1762 ret = hp_switch_enable(enable);
1763 snd_soc_update_bits(codec, SOC_REG(DCR2_DCR1), BIT(HPL_EN), 0);
1764 snd_soc_update_bits(codec, SOC_REG(DCR2_DCR1), BIT(HPR_EN), 0);
1765 #ifndef CONFIG_CODEC_NO_HP_POP
1766 hp_pop_enable(enable);
1773 static int spk_switch_enable(int enable)
1775 struct snd_soc_codec *codec = &s_sprd_codec;
1776 sprd_codec_dbg("Entering %s is %s\n", __func__, _2str(enable));
1778 if (snd_soc_read(codec, DCR2_DCR1) & BIT(AOL_EN)) {
1780 sprd_codec_pa_sw_set(SPRD_CODEC_PA_SW_AOL);
1782 sprd_codec_pa_sw_clr(SPRD_CODEC_PA_SW_AOL);
1786 _mixer_setting(codec, SPRD_CODEC_SPK_DACL,
1787 SPRD_CODEC_SPK_MIXER_MAX, SPRD_CODEC_LEFT,
1788 (snd_soc_read(codec, DCR2_DCR1) & BIT(AOL_EN)));
1790 _mixer_setting(codec, SPRD_CODEC_SPK_DACL,
1791 SPRD_CODEC_SPK_MIXER_MAX, SPRD_CODEC_RIGHT,
1792 (snd_soc_read(codec, DCR2_DCR1) & BIT(AOR_EN)));
1794 sprd_codec_dbg("Leaving %s\n", __func__);
1799 int spkl_switch(int enable)
1802 struct snd_soc_codec *codec = &s_sprd_codec;
1805 snd_soc_update_bits(codec, SOC_REG(DCR2_DCR1), BIT(AOL_EN),
1807 ret = spk_switch_enable(enable);
1809 ret = spk_switch_enable(enable);
1810 snd_soc_update_bits(codec, SOC_REG(DCR2_DCR1), BIT(AOL_EN), 0);
1816 int spkr_switch(int enable)
1819 struct snd_soc_codec *codec = &s_sprd_codec;
1822 snd_soc_update_bits(codec, SOC_REG(DCR2_DCR1), BIT(AOR_EN),
1824 ret = spk_switch_enable(enable);
1826 ret = spk_switch_enable(enable);
1827 snd_soc_update_bits(codec, SOC_REG(DCR2_DCR1), BIT(AOR_EN), 0);
1833 static int ear_switch_enable(int enable)
1836 sprd_codec_dbg("Entering %s is %s\n", __func__, _2str(enable));
1838 #ifdef CONFIG_SPRD_CODEC_EAR_WITH_IN_SPK
1840 sprd_codec_pa_sw_set(SPRD_CODEC_PA_SW_EAR);
1842 sprd_codec_pa_sw_clr(SPRD_CODEC_PA_SW_EAR);
1846 sprd_codec_dbg("Leaving %s\n", __func__);
1851 int ear_switch(int enable)
1854 struct snd_soc_codec *codec = &s_sprd_codec;
1857 ret = ear_switch_enable(enable);
1858 snd_soc_update_bits(codec, SOC_REG(DCR2_DCR1), BIT(EAR_EN),
1861 snd_soc_update_bits(codec, SOC_REG(DCR2_DCR1), BIT(EAR_EN), 0);
1862 ret = ear_switch_enable(enable);
1868 static int adcpgal_set(struct snd_soc_codec *codec, int on)
1870 int mask = ADCPGAL_EN_MASK << ADCPGAL_EN;
1871 return snd_soc_update_bits(codec, SOC_REG(AACR2_AACR1), mask,
1875 static int adcpgar_set(struct snd_soc_codec *codec, int on)
1877 int mask = ADCPGAR_EN_MASK << ADCPGAR_EN;
1878 return snd_soc_update_bits(codec, SOC_REG(AACR2_AACR1), mask,
1882 static int adc_switch_enable(int enable, int right)
1884 struct snd_soc_codec *codec = &s_sprd_codec;
1885 int is_right = (right == SPRD_CODEC_RIGHT);
1886 sprd_codec_dbg("Entering %s is %s\n", __func__, _2str(enable));
1889 adcpgar_set(codec, enable);
1890 _mixer_setting(codec, SPRD_CODEC_AIL, SPRD_CODEC_ADC_MIXER_MAX,
1891 SPRD_CODEC_RIGHT, enable);
1893 adcpgal_set(codec, enable);
1894 _mixer_setting(codec, SPRD_CODEC_AIL, SPRD_CODEC_ADC_MIXER_MAX,
1895 SPRD_CODEC_LEFT, enable);
1898 sprd_codec_dbg("Leaving %s\n", __func__);
1903 static int adc_digital_power(int enable)
1906 struct snd_soc_codec *codec = &s_sprd_codec;
1907 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
1908 sprd_codec_dbg("%s %s %d\n", __func__, _2str(enable),
1909 atomic_read(&sprd_codec->adc_digital_power_refcount));
1911 atomic_inc(&sprd_codec->adc_digital_power_refcount);
1912 if (atomic_read(&sprd_codec->adc_digital_power_refcount) == 1) {
1913 digital_power_enable(enable);
1914 snd_soc_update_bits(codec, SOC_REG(CCR),
1915 BIT(ADC_CLK_EN), BIT(ADC_CLK_EN));
1916 adie_adc_enable(enable);
1919 if (atomic_dec_and_test
1920 (&sprd_codec->adc_digital_power_refcount)) {
1921 snd_soc_update_bits(codec, SOC_REG(CCR),
1922 BIT(ADC_CLK_EN), 0);
1923 adie_adc_enable(enable);
1924 digital_power_enable(enable);
1930 int adcl_digital_switch(int enable)
1933 struct snd_soc_codec *codec = &s_sprd_codec;
1935 ret = adc_digital_power(enable);
1936 snd_soc_update_bits(codec, SOC_REG(AACR2_AACR1), BIT(ADCL_PD),
1938 snd_soc_update_bits(codec, SOC_REG(AUD_TOP_CTL), BIT(ADC_EN_L),
1941 snd_soc_update_bits(codec, SOC_REG(AACR2_AACR1), BIT(ADCL_PD),
1943 snd_soc_update_bits(codec, SOC_REG(AUD_TOP_CTL), BIT(ADC_EN_L),
1945 ret = adc_digital_power(enable);
1950 int adcr_digital_switch(int enable)
1953 struct snd_soc_codec *codec = &s_sprd_codec;
1955 ret = adc_digital_power(enable);
1956 snd_soc_update_bits(codec, SOC_REG(AACR2_AACR1), BIT(ADCR_PD),
1958 snd_soc_update_bits(codec, SOC_REG(AUD_TOP_CTL), BIT(ADC_EN_R),
1961 snd_soc_update_bits(codec, SOC_REG(AACR2_AACR1), BIT(ADCR_PD),
1963 snd_soc_update_bits(codec, SOC_REG(AUD_TOP_CTL), BIT(ADC_EN_R),
1965 ret = adc_digital_power(enable);
1970 static int adc_power(int enable)
1973 struct snd_soc_codec *codec = &s_sprd_codec;
1974 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
1975 sprd_codec_dbg("%s %s %d\n", __func__, _2str(enable),
1976 atomic_read(&sprd_codec->adc_power_refcount));
1978 atomic_inc(&sprd_codec->adc_power_refcount);
1979 if (atomic_read(&sprd_codec->adc_power_refcount) == 1) {
1980 analog_power_enable(enable);
1981 snd_soc_update_bits(codec, SOC_REG(AACR2_AACR1),
1982 BIT(ADC_IBUF_PD), 0);
1985 if (atomic_dec_and_test(&sprd_codec->adc_power_refcount)) {
1986 snd_soc_update_bits(codec, SOC_REG(AACR2_AACR1),
1987 BIT(ADC_IBUF_PD), BIT(ADC_IBUF_PD));
1988 analog_power_enable(enable);
1994 int adcl_switch(int enable)
1999 ret = adc_switch_enable(enable, SPRD_CODEC_LEFT);
2001 ret = adc_switch_enable(enable, SPRD_CODEC_LEFT);
2007 int adcr_switch(int enable)
2012 ret = adc_switch_enable(enable, SPRD_CODEC_RIGHT);
2014 ret = adc_switch_enable(enable, SPRD_CODEC_RIGHT);
2020 int pga_enable(int id, int pgaval, int enable)
2022 struct snd_soc_codec *codec = &s_sprd_codec;
2023 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
2024 struct sprd_codec_pga_op *pga = &(sprd_codec->pga[id]);
2026 int min = sprd_codec_pga_cfg[id].min;
2027 static int s_need_wait = 1;
2029 pga->pgaval = pgaval;
2031 sprd_codec_dbg("Entering %s set %s(%d) is %s\n", __func__,
2032 sprd_codec_pga_debug_str[id], pga->pgaval,
2036 if ((id == SPRD_CODEC_PGA_ADCL) || (id == SPRD_CODEC_PGA_ADCR)) {
2037 if (s_need_wait == 1) {
2038 /* NOTES: reduce linein pop noise must delay 250ms
2039 after linein mixer switch on.
2040 actually this function perform after
2041 adc_switch_enable function for
2042 both ADCL/ADCR switch complete.
2044 if (sprd_codec_is_ai_enable(codec)) {
2045 sprd_codec_wait(250);
2046 sprd_codec_dbg("ADC Switch ON delay\n");
2051 pga->set = sprd_codec_pga_cfg[id].set;
2052 ret = pga->set(codec, pga->pgaval);
2054 if ((id == SPRD_CODEC_PGA_ADCL) || (id == SPRD_CODEC_PGA_ADCR)) {
2058 ret = sprd_codec_pga_cfg[id].set(codec, min);
2061 sprd_codec_dbg("Leaving %s\n", __func__);
2066 int mic_bias_enable(int id, int enable)
2070 sprd_codec_dbg("Entering %s %s is %s\n", __func__,
2071 mic_bias_name[id], _2str(enable));
2074 case SPRD_CODEC_MIC_BIAS:
2075 if (!(atomic_read(&sprd_codec_power.mic_on) > 0)) {
2076 sprd_codec_mic_bias_en(enable);
2079 case SPRD_CODEC_AUXMIC_BIAS:
2080 if (!(atomic_read(&sprd_codec_power.auxmic_on) > 0)) {
2081 sprd_codec_auxmic_bias_en(enable);
2089 sprd_codec_dbg("Leaving %s\n", __func__);
2094 int mixer_enable(int id, int enable)
2096 struct snd_soc_codec *codec = &s_sprd_codec;
2097 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
2098 struct sprd_codec_mixer *mixer = &(sprd_codec->mixer[id]);
2101 pr_info("%s is %s\n", sprd_codec_mixer_debug_str[id], _2str(enable));
2109 _mixer_setting_one(codec, id, mixer->on);
2111 sprd_codec_dbg("Leaving %s\n", __func__);
2116 int mixer_get(int id)
2118 struct snd_soc_codec *codec = &s_sprd_codec;
2119 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
2120 return sprd_codec->mixer[id].on;
2123 int mixer_set(int id, int on)
2125 struct snd_soc_codec *codec = &s_sprd_codec;
2126 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
2127 struct sprd_codec_mixer *mixer = &(sprd_codec->mixer[id]);
2130 pr_info("set %s switch %s\n", sprd_codec_mixer_debug_str[id],
2133 if (mixer->on == on)
2139 ret = mixer->set(codec, mixer->on);
2141 sprd_codec_dbg("Leaving %s\n", __func__);
2146 static int sprd_codec_vol_put(int id, int pgaval)
2148 struct snd_soc_codec *codec = &s_sprd_codec;
2149 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
2150 struct sprd_codec_pga_op *pga = &(sprd_codec->pga[id]);
2153 pr_info("set PGA[%s] to %d\n", sprd_codec_pga_debug_str[id], pgaval);
2155 pga->pgaval = pgaval;
2157 ret = pga->set(codec, pga->pgaval);
2159 sprd_codec_dbg("Leaving %s\n", __func__);
2163 static int sprd_codec_vol_get(int id)
2165 struct snd_soc_codec *codec = &s_sprd_codec;
2166 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
2167 struct sprd_codec_pga_op *pga = &(sprd_codec->pga[id]);
2172 static int sprd_codec_inter_pa_put(int config)
2176 pr_info("config inter PA 0x%08x\n", config);
2178 mutex_lock(&inter_pa_mutex);
2179 inter_pa.value = (u32) config;
2181 mutex_unlock(&inter_pa_mutex);
2182 sprd_inter_speaker_pa(1);
2184 mutex_unlock(&inter_pa_mutex);
2186 sprd_codec_dbg("Leaving %s\n", __func__);
2190 static int sprd_codec_inter_pa_get(void)
2193 mutex_lock(&inter_pa_mutex);
2194 ret = inter_pa.value;
2195 mutex_unlock(&inter_pa_mutex);
2200 static int sprd_codec_inter_hp_pa_put(int config)
2204 pr_info("config inter HP PA 0x%08x\n", config);
2206 mutex_lock(&inter_hp_pa_mutex);
2207 inter_hp_pa.value = (u32) config;
2208 if (inter_hp_pa.set) {
2209 mutex_unlock(&inter_hp_pa_mutex);
2210 sprd_inter_headphone_pa(1);
2212 mutex_unlock(&inter_hp_pa_mutex);
2214 sprd_codec_dbg("Leaving %s\n", __func__);
2218 static int sprd_codec_inter_hp_pa_get(void)
2221 mutex_lock(&inter_hp_pa_mutex);
2222 ret = inter_hp_pa.value;
2223 mutex_unlock(&inter_hp_pa_mutex);
2228 int sprd_codec_pcm_set_sample_rate(int playback, int rate)
2230 struct snd_soc_codec *codec = &s_sprd_codec;
2231 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
2236 sprd_codec->da_sample_val = rate;
2237 pr_info("playback rate is [%d]\n", rate);
2238 sprd_codec_set_sample_rate(codec, rate, mask, shift);
2240 sprd_codec->ad_sample_val = rate;
2241 pr_info("capture rate is [%d]\n", rate);
2242 sprd_codec_set_ad_sample_rate(codec, rate, mask, shift);
2243 sprd_codec_set_ad_sample_rate(codec, rate,
2244 ADC1_SRC_N_MASK, ADC1_SRC_N);
2250 #ifdef CONFIG_SPRD_CODEC_USE_INT
2251 #ifdef CONFIG_CODEC_DAC_MUTE_WAIT
2252 static void sprd_codec_dac_mute_irq_enable(struct snd_soc_codec *codec)
2254 int mask = BIT(DAC_MUTE_D);
2255 snd_soc_update_bits(codec, SOC_REG(AUD_INT_CLR), mask, mask);
2256 snd_soc_update_bits(codec, SOC_REG(AUD_INT_EN), mask, mask);
2260 static irqreturn_t sprd_codec_dp_irq(int irq, void *dev_id)
2263 struct sprd_codec_priv *sprd_codec = dev_id;
2264 struct snd_soc_codec *codec = sprd_codec->codec;
2265 mask = snd_soc_read(codec, AUD_AUD_STS0);
2266 sprd_codec_dbg("dac mute irq mask = 0x%x\n", mask);
2267 if (BIT(DAC_MUTE_D_MASK) & mask) {
2268 mask = BIT(DAC_MUTE_D);
2269 complete(&sprd_codec->completion_dac_mute);
2271 if (BIT(DAC_MUTE_U_MASK) & mask) {
2272 mask = BIT(DAC_MUTE_U);
2274 snd_soc_update_bits(codec, SOC_REG(AUD_INT_EN), mask, 0);
2279 static int sprd_codec_digital_mute(int mute)
2281 struct snd_soc_codec *codec = &s_sprd_codec;
2282 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
2285 sprd_codec_dbg("Entering %s\n", __func__);
2287 if (atomic_read(&sprd_codec->power_refcount) >= 1) {
2288 sprd_codec_dbg("mute %i\n", mute);
2291 snd_soc_update_bits(codec, SOC_REG(AUD_DAC_CTL),
2292 BIT(DAC_MUTE_START),
2293 mute ? BIT(DAC_MUTE_START) : 0);
2294 #ifdef CONFIG_CODEC_DAC_MUTE_WAIT
2295 #ifdef CONFIG_SPRD_CODEC_USE_INT
2297 int dac_mute_complete;
2298 sprd_codec_dbg("dac mute irq enable\n");
2299 sprd_codec_dac_mute_irq_enable(codec);
2300 init_completion(&sprd_codec->completion_dac_mute);
2302 wait_for_completion_timeout
2303 (&sprd_codec->completion_dac_mute,
2304 msecs_to_jiffies(SPRD_CODEC_DAC_MUTE_TIMEOUT));
2305 sprd_codec_dbg("dac mute completion %d\n",
2307 if (!dac_mute_complete) {
2308 pr_err("dac mute timeout\n");
2313 sprd_codec_wait(SPRD_CODEC_DAC_MUTE_WAIT_TIME);
2318 sprd_codec_dbg("return %i\n", ret);
2321 sprd_codec_dbg("Leaving %s\n", __func__);
2326 static int sprd_codec_probe(void)
2328 struct snd_soc_codec *codec = &s_sprd_codec;
2329 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
2331 sprd_codec_dbg("Entering %s\n", __func__);
2333 sprd_codec->codec = codec;
2335 atomic_set(&sprd_codec->power_refcount, 0);
2336 atomic_set(&sprd_codec->adie_adc_refcount, 0);
2337 atomic_set(&sprd_codec->adie_dac_refcount, 0);
2338 atomic_set(&sprd_codec->adc_power_refcount, 0);
2339 atomic_set(&sprd_codec->adc_digital_power_refcount, 0);
2340 atomic_set(&sprd_codec->dac_power_refcount, 0);
2341 atomic_set(&sprd_codec->dac_digital_power_refcount, 0);
2342 atomic_set(&sprd_codec->digital_power_refcount, 0);
2343 atomic_set(&sprd_codec->analog_power_refcount, 0);
2345 #ifdef CONFIG_SPRD_CODEC_USE_INT
2346 sprd_codec->ap_irq = CODEC_AP_IRQ;
2349 request_irq(sprd_codec->ap_irq, sprd_codec_ap_irq, 0,
2350 "sprd_codec_ap", sprd_codec);
2352 pr_err("request_irq ap failed!\n");
2356 sprd_codec->dp_irq = CODEC_DP_IRQ;
2359 request_irq(sprd_codec->dp_irq, sprd_codec_dp_irq, 0,
2360 "sprd_codec_dp", sprd_codec);
2362 pr_err("request_irq dp failed!\n");
2367 sprd_codec_dbg("Leaving %s\n", __func__);
2371 #ifdef CONFIG_SPRD_CODEC_USE_INT
2373 free_irq(sprd_codec->ap_irq, sprd_codec);
2379 static int sprd_codec_deinit(void)
2381 #ifdef CONFIG_SPRD_CODEC_USE_INT
2382 struct snd_soc_codec *codec = &s_sprd_codec;
2383 struct sprd_codec_priv *sprd_codec = snd_soc_codec_get_drvdata(codec);
2384 free_irq(sprd_codec->ap_irq, sprd_codec);
2385 free_irq(sprd_codec->dp_irq, sprd_codec);
2390 int sprd_codec_init(void)
2392 sprd_codec_inter_pa_init();
2393 sprd_codec_inter_hp_pa_init();
2394 arch_audio_codec_switch(AUDIO_TO_AP_ARM_CTRL);
2399 void sprd_codec_exit(void)
2401 sprd_codec_deinit();
2404 module_init(sprd_codec_init);
2405 module_exit(sprd_codec_exit);
2407 MODULE_DESCRIPTION("SPRD-CODEC ALSA SoC codec driver");
2408 MODULE_AUTHOR("Zhenfang Wang <zhenfang.wang@spreadtrum.com>");
2409 MODULE_LICENSE("GPL");