diff options
author | Manoj Gangwal <mgangwal@nvidia.com> | 2012-02-28 18:51:55 +0530 |
---|---|---|
committer | Simone Willett <swillett@nvidia.com> | 2012-03-02 17:52:45 -0800 |
commit | 2f1547fd357c90df9532740e6019a9141b9aeff3 (patch) | |
tree | 1066de15c0f89276147b63a45164aff34ab6030a /sound/soc/codecs | |
parent | 6dc6dc55db9eebc83373e7bb3ef42e92ee77c8f7 (diff) |
asoc: codecs: Add Headset detect support for ALC5639/40
Add support for headset detection for ALC5639/40
codec for kai board.
Bug 937914
Change-Id: I0bb9e913601c37a1cc8f7094fbdd3885aeec92b3
Signed-off-by: Manoj Gangwal <mgangwal@nvidia.com>
Reviewed-on: http://git-master/r/86348
Reviewed-by: Chandler Zhang <chazhang@nvidia.com>
Tested-by: Chandler Zhang <chazhang@nvidia.com>
Reviewed-by: Sachin Nikam <snikam@nvidia.com>
Reviewed-by: Sumit Bhattacharya <sumitb@nvidia.com>
Diffstat (limited to 'sound/soc/codecs')
-rw-r--r-- | sound/soc/codecs/rt5639.c | 35 | ||||
-rw-r--r-- | sound/soc/codecs/rt5639.h | 6 | ||||
-rw-r--r-- | sound/soc/codecs/rt5640.c | 35 | ||||
-rw-r--r-- | sound/soc/codecs/rt5640.h | 4 |
4 files changed, 80 insertions, 0 deletions
diff --git a/sound/soc/codecs/rt5639.c b/sound/soc/codecs/rt5639.c index e51c1f0f48df..74d8a318a831 100644 --- a/sound/soc/codecs/rt5639.c +++ b/sound/soc/codecs/rt5639.c @@ -418,6 +418,41 @@ static int rt5639_readable_register( } } +int rt5639_headset_detect(struct snd_soc_codec *codec, int jack_insert) +{ + int jack_type; + + if (jack_insert) { + snd_soc_update_bits(codec, RT5639_PWR_ANLG1, + RT5639_PWR_LDO2, RT5639_PWR_LDO2); + snd_soc_update_bits(codec, RT5639_PWR_ANLG2, + RT5639_PWR_MB1, RT5639_PWR_MB1); + snd_soc_update_bits(codec, RT5639_MICBIAS, + RT5639_MIC1_OVCD_MASK | RT5639_MIC1_OVTH_MASK | + RT5639_PWR_CLK25M_MASK | RT5639_PWR_MB_MASK, + RT5639_MIC1_OVCD_EN | RT5639_MIC1_OVTH_600UA | + RT5639_PWR_MB_PU | RT5639_PWR_CLK25M_PU); + snd_soc_update_bits(codec, RT5639_DUMMY1, + 0x1, 0x1); + msleep(50); + if (snd_soc_read(codec, RT5639_IRQ_CTRL2) & 0x8) + jack_type = RT5639_HEADPHO_DET; + else + jack_type = RT5639_HEADSET_DET; + snd_soc_update_bits(codec, RT5639_IRQ_CTRL2, + RT5639_MB1_OC_CLR, 0); + } else { + snd_soc_update_bits(codec, RT5639_MICBIAS, + RT5639_MIC1_OVCD_MASK, + RT5639_MIC1_OVCD_DIS); + + jack_type = RT5639_NO_JACK; + } + + return jack_type; +} +EXPORT_SYMBOL(rt5639_headset_detect); + static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0); static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0); static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0); diff --git a/sound/soc/codecs/rt5639.h b/sound/soc/codecs/rt5639.h index 163db7a0dbe9..f75ddad1aa0b 100644 --- a/sound/soc/codecs/rt5639.h +++ b/sound/soc/codecs/rt5639.h @@ -2025,6 +2025,12 @@ enum { /* Debug String Length */ #define RT5639_REG_DISP_LEN 10 +#define RT5639_NO_JACK BIT(0) +#define RT5639_HEADSET_DET BIT(1) +#define RT5639_HEADPHO_DET BIT(2) + +int rt5639_headset_detect(struct snd_soc_codec *codec, int jack_insert); + /* System Clock Source */ enum { RT5639_SCLK_S_MCLK, diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c index fdfa6b5f13e7..dfeb1dce9d29 100644 --- a/sound/soc/codecs/rt5640.c +++ b/sound/soc/codecs/rt5640.c @@ -419,6 +419,41 @@ static int rt5640_readable_register( } } +int rt5640_headset_detect(struct snd_soc_codec *codec, int jack_insert) +{ + int jack_type; + + if (jack_insert) { + snd_soc_update_bits(codec, RT5640_PWR_ANLG1, + RT5640_PWR_LDO2, RT5640_PWR_LDO2); + snd_soc_update_bits(codec, RT5640_PWR_ANLG2, + RT5640_PWR_MB1, RT5640_PWR_MB1); + snd_soc_update_bits(codec, RT5640_MICBIAS, + RT5640_MIC1_OVCD_MASK | RT5640_MIC1_OVTH_MASK | + RT5640_PWR_CLK25M_MASK | RT5640_PWR_MB_MASK, + RT5640_MIC1_OVCD_EN | RT5640_MIC1_OVTH_600UA | + RT5640_PWR_MB_PU | RT5640_PWR_CLK25M_PU); + snd_soc_update_bits(codec, RT5640_DUMMY1, + 0x1, 0x1); + msleep(50); + if (snd_soc_read(codec, RT5640_IRQ_CTRL2) & 0x8) + jack_type = RT5640_HEADPHO_DET; + else + jack_type = RT5640_HEADSET_DET; + snd_soc_update_bits(codec, RT5640_IRQ_CTRL2, + RT5640_MB1_OC_CLR, 0); + } else { + snd_soc_update_bits(codec, RT5640_MICBIAS, + RT5640_MIC1_OVCD_MASK, + RT5640_MIC1_OVCD_DIS); + + jack_type = RT5640_NO_JACK; + } + + return jack_type; +} +EXPORT_SYMBOL(rt5640_headset_detect); + static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0); static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0); static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0); diff --git a/sound/soc/codecs/rt5640.h b/sound/soc/codecs/rt5640.h index ba9ac7f78b20..d6920f00e08e 100644 --- a/sound/soc/codecs/rt5640.h +++ b/sound/soc/codecs/rt5640.h @@ -2019,7 +2019,11 @@ enum { #define RT5640_EQ_PST_VOL_MASK (0xffff) #define RT5640_EQ_PST_VOL_SFT 0 +#define RT5640_NO_JACK BIT(0) +#define RT5640_HEADSET_DET BIT(1) +#define RT5640_HEADPHO_DET BIT(2) +int rt5640_headset_detect(struct snd_soc_codec *codec, int jack_insert); /* System Clock Source */ #define RT5640_SCLK_S_MCLK 0 |