summaryrefslogtreecommitdiff
path: root/sound/soc/codecs
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
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')
-rw-r--r--sound/soc/codecs/rt5639.c35
-rw-r--r--sound/soc/codecs/rt5639.h6
-rw-r--r--sound/soc/codecs/rt5640.c35
-rw-r--r--sound/soc/codecs/rt5640.h4
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