summaryrefslogtreecommitdiff
path: root/sound/soc/codecs/rt5640.c
diff options
context:
space:
mode:
authorManoj Gangwal <mgangwal@nvidia.com>2012-02-28 18:51:55 +0530
committerSimone Willett <swillett@nvidia.com>2012-03-02 17:52:45 -0800
commit2f1547fd357c90df9532740e6019a9141b9aeff3 (patch)
tree1066de15c0f89276147b63a45164aff34ab6030a /sound/soc/codecs/rt5640.c
parent6dc6dc55db9eebc83373e7bb3ef42e92ee77c8f7 (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/rt5640.c')
-rw-r--r--sound/soc/codecs/rt5640.c35
1 files changed, 35 insertions, 0 deletions
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);