aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorAshish Chavan <ashish.chavan@kpitcummins.com>2011-10-19 04:49:06 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2011-10-19 12:58:58 -0400
commit5eda19497b0af2533a69f67b552cf7baae11f377 (patch)
treeb2125c230007371ed0abea6d4100144b2b5cf5e7 /sound
parent812b404c90d302e3f352568606c8c37c3ee1e4c7 (diff)
ASoC: da7210: Add support for mute and zero cross controls
This patch adds support for below set of controls, (1) Mute controls for MIC, AUX and ADC (2) Zero cross controls for head phone, AUX, INPGA and line out (3) Head phone mode selection - class H or G It also adds digital_mute() call back. Signed-off-by: Ashish Chavan <ashish.chavan@kpitcummins.com> Signed-off-by: David Dajun Chen <dchen@diasemi.com> Acked-by: Liam Girdwood <lrg@ti.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/codecs/da7210.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/sound/soc/codecs/da7210.c b/sound/soc/codecs/da7210.c
index fa0d5125e70b..4aad01c10c53 100644
--- a/sound/soc/codecs/da7210.c
+++ b/sound/soc/codecs/da7210.c
@@ -30,6 +30,7 @@
30#define DA7210_STARTUP1 0x03 30#define DA7210_STARTUP1 0x03
31#define DA7210_MIC_L 0x07 31#define DA7210_MIC_L 0x07
32#define DA7210_MIC_R 0x08 32#define DA7210_MIC_R 0x08
33#define DA7210_AUX2 0x0B
33#define DA7210_INMIX_L 0x0D 34#define DA7210_INMIX_L 0x0D
34#define DA7210_INMIX_R 0x0E 35#define DA7210_INMIX_R 0x0E
35#define DA7210_ADC_HPF 0x0F 36#define DA7210_ADC_HPF 0x0F
@@ -41,6 +42,7 @@
41#define DA7210_DAC_L 0x15 42#define DA7210_DAC_L 0x15
42#define DA7210_DAC_R 0x16 43#define DA7210_DAC_R 0x16
43#define DA7210_DAC_SEL 0x17 44#define DA7210_DAC_SEL 0x17
45#define DA7210_SOFTMUTE 0x18
44#define DA7210_DAC_EQ1_2 0x19 46#define DA7210_DAC_EQ1_2 0x19
45#define DA7210_DAC_EQ3_4 0x1A 47#define DA7210_DAC_EQ3_4 0x1A
46#define DA7210_DAC_EQ5 0x1B 48#define DA7210_DAC_EQ5 0x1B
@@ -49,6 +51,7 @@
49#define DA7210_HP_L_VOL 0x21 51#define DA7210_HP_L_VOL 0x21
50#define DA7210_HP_R_VOL 0x22 52#define DA7210_HP_R_VOL 0x22
51#define DA7210_HP_CFG 0x23 53#define DA7210_HP_CFG 0x23
54#define DA7210_ZERO_CROSS 0x24
52#define DA7210_DAI_SRC_SEL 0x25 55#define DA7210_DAI_SRC_SEL 0x25
53#define DA7210_DAI_CFG1 0x26 56#define DA7210_DAI_CFG1 0x26
54#define DA7210_DAI_CFG3 0x28 57#define DA7210_DAI_CFG3 0x28
@@ -144,6 +147,9 @@
144#define DA7210_PLL_FS_96000 (0xF << 0) 147#define DA7210_PLL_FS_96000 (0xF << 0)
145#define DA7210_PLL_EN (0x1 << 7) 148#define DA7210_PLL_EN (0x1 << 7)
146 149
150/* SOFTMUTE bit fields */
151#define DA7210_RAMP_EN (1 << 6)
152
147#define DA7210_VERSION "0.0.1" 153#define DA7210_VERSION "0.0.1"
148 154
149/* 155/*
@@ -189,6 +195,13 @@ static const struct soc_enum da7210_dac_vf_cutoff =
189static const struct soc_enum da7210_adc_vf_cutoff = 195static const struct soc_enum da7210_adc_vf_cutoff =
190 SOC_ENUM_SINGLE(DA7210_ADC_HPF, 4, 8, da7210_vf_cutoff_txt); 196 SOC_ENUM_SINGLE(DA7210_ADC_HPF, 4, 8, da7210_vf_cutoff_txt);
191 197
198static const char *da7210_hp_mode_txt[] = {
199 "Class H", "Class G"
200};
201
202static const struct soc_enum da7210_hp_mode_sel =
203 SOC_ENUM_SINGLE(DA7210_HP_CFG, 0, 2, da7210_hp_mode_txt);
204
192static const struct snd_kcontrol_new da7210_snd_controls[] = { 205static const struct snd_kcontrol_new da7210_snd_controls[] = {
193 206
194 SOC_DOUBLE_R_TLV("HeadPhone Playback Volume", 207 SOC_DOUBLE_R_TLV("HeadPhone Playback Volume",
@@ -232,6 +245,21 @@ static const struct snd_kcontrol_new da7210_snd_controls[] = {
232 SOC_ENUM("ADC HPF Cutoff", da7210_adc_hpf_cutoff), 245 SOC_ENUM("ADC HPF Cutoff", da7210_adc_hpf_cutoff),
233 SOC_SINGLE("ADC Voice Mode Switch", DA7210_ADC_HPF, 7, 1, 0), 246 SOC_SINGLE("ADC Voice Mode Switch", DA7210_ADC_HPF, 7, 1, 0),
234 SOC_ENUM("ADC Voice Cutoff", da7210_adc_vf_cutoff), 247 SOC_ENUM("ADC Voice Cutoff", da7210_adc_vf_cutoff),
248
249 /* Mute controls */
250 SOC_DOUBLE_R("Mic Capture Switch", DA7210_MIC_L, DA7210_MIC_R, 3, 1, 0),
251 SOC_SINGLE("Aux2 Capture Switch", DA7210_AUX2, 2, 1, 0),
252 SOC_DOUBLE("ADC Capture Switch", DA7210_ADC, 2, 6, 1, 0),
253 SOC_SINGLE("Digital Soft Mute Switch", DA7210_SOFTMUTE, 7, 1, 0),
254 SOC_SINGLE("Digital Soft Mute Rate", DA7210_SOFTMUTE, 0, 0x7, 0),
255
256 /* Zero cross controls */
257 SOC_DOUBLE("Aux1 ZC Switch", DA7210_ZERO_CROSS, 0, 1, 1, 0),
258 SOC_DOUBLE("In PGA ZC Switch", DA7210_ZERO_CROSS, 2, 3, 1, 0),
259 SOC_DOUBLE("Lineout ZC Switch", DA7210_ZERO_CROSS, 4, 5, 1, 0),
260 SOC_DOUBLE("Headphone ZC Switch", DA7210_ZERO_CROSS, 6, 7, 1, 0),
261
262 SOC_ENUM("Headphone Class", da7210_hp_mode_sel),
235}; 263};
236 264
237/* Codec private data */ 265/* Codec private data */
@@ -448,6 +476,18 @@ static int da7210_set_dai_fmt(struct snd_soc_dai *codec_dai, u32 fmt)
448 return 0; 476 return 0;
449} 477}
450 478
479static int da7210_mute(struct snd_soc_dai *dai, int mute)
480{
481 struct snd_soc_codec *codec = dai->codec;
482 u8 mute_reg = snd_soc_read(codec, DA7210_DAC_HPF) & 0xFB;
483
484 if (mute)
485 snd_soc_write(codec, DA7210_DAC_HPF, mute_reg | 0x4);
486 else
487 snd_soc_write(codec, DA7210_DAC_HPF, mute_reg);
488 return 0;
489}
490
451#define DA7210_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ 491#define DA7210_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
452 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) 492 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
453 493
@@ -456,6 +496,7 @@ static struct snd_soc_dai_ops da7210_dai_ops = {
456 .startup = da7210_startup, 496 .startup = da7210_startup,
457 .hw_params = da7210_hw_params, 497 .hw_params = da7210_hw_params,
458 .set_fmt = da7210_set_dai_fmt, 498 .set_fmt = da7210_set_dai_fmt,
499 .digital_mute = da7210_mute,
459}; 500};
460 501
461static struct snd_soc_dai_driver da7210_dai = { 502static struct snd_soc_dai_driver da7210_dai = {
@@ -545,6 +586,9 @@ static int da7210_probe(struct snd_soc_codec *codec)
545 DA7210_HP_2CAP_MODE | DA7210_HP_SENSE_EN | 586 DA7210_HP_2CAP_MODE | DA7210_HP_SENSE_EN |
546 DA7210_HP_L_EN | DA7210_HP_MODE | DA7210_HP_R_EN); 587 DA7210_HP_L_EN | DA7210_HP_MODE | DA7210_HP_R_EN);
547 588
589 /* Enable ramp mode for DAC gain update */
590 snd_soc_write(codec, DA7210_SOFTMUTE, DA7210_RAMP_EN);
591
548 /* Diable PLL and bypass it */ 592 /* Diable PLL and bypass it */
549 snd_soc_write(codec, DA7210_PLL, DA7210_PLL_FS_48000); 593 snd_soc_write(codec, DA7210_PLL, DA7210_PLL_FS_48000);
550 594