aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBard Liao <bardliao@realtek.com>2014-11-18 03:50:18 -0500
committerMark Brown <broonie@kernel.org>2014-11-25 07:09:48 -0500
commit2d4e2d020516632288e8c8d1f8be2f3042d6b8de (patch)
tree03c53e6f15db3d4f3b6027f4d1f23213ac209ffe
parent471f208af987a3741757c169c4e2ad984359000b (diff)
ASoC: rt5645: multiple JD mode support
There are 3 JD modes in RT5645. This patch configure register values according to platform data. Signed-off-by: Bard Liao <bardliao@realtek.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--include/sound/rt5645.h1
-rw-r--r--sound/soc/codecs/rt5645.c35
-rw-r--r--sound/soc/codecs/rt5645.h7
3 files changed, 42 insertions, 1 deletions
diff --git a/include/sound/rt5645.h b/include/sound/rt5645.h
index 937f421bc66b..120d9610054e 100644
--- a/include/sound/rt5645.h
+++ b/include/sound/rt5645.h
@@ -26,6 +26,7 @@ struct rt5645_platform_data {
26 26
27 /* true if codec's jd function is used */ 27 /* true if codec's jd function is used */
28 bool en_jd_func; 28 bool en_jd_func;
29 unsigned int jd_mode;
29}; 30};
30 31
31#endif 32#endif
diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c
index ef88b506a017..6e9cd8e743a7 100644
--- a/sound/soc/codecs/rt5645.c
+++ b/sound/soc/codecs/rt5645.c
@@ -2239,7 +2239,8 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec)
2239 2239
2240 snd_soc_dapm_disable_pin(&codec->dapm, "micbias1"); 2240 snd_soc_dapm_disable_pin(&codec->dapm, "micbias1");
2241 snd_soc_dapm_disable_pin(&codec->dapm, "micbias2"); 2241 snd_soc_dapm_disable_pin(&codec->dapm, "micbias2");
2242 snd_soc_dapm_disable_pin(&codec->dapm, "LDO2"); 2242 if (rt5645->pdata.jd_mode == 0)
2243 snd_soc_dapm_disable_pin(&codec->dapm, "LDO2");
2243 snd_soc_dapm_disable_pin(&codec->dapm, "Mic Det Power"); 2244 snd_soc_dapm_disable_pin(&codec->dapm, "Mic Det Power");
2244 snd_soc_dapm_sync(&codec->dapm); 2245 snd_soc_dapm_sync(&codec->dapm);
2245 } 2246 }
@@ -2543,6 +2544,38 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
2543 RT5645_IRQ_CLK_INT, RT5645_IRQ_CLK_INT); 2544 RT5645_IRQ_CLK_INT, RT5645_IRQ_CLK_INT);
2544 } 2545 }
2545 2546
2547 if (rt5645->pdata.jd_mode) {
2548 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
2549 RT5645_IRQ_JD_1_1_EN, RT5645_IRQ_JD_1_1_EN);
2550 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3,
2551 RT5645_JD_PSV_MODE, RT5645_JD_PSV_MODE);
2552 regmap_update_bits(rt5645->regmap, RT5645_HPO_MIXER,
2553 RT5645_IRQ_PSV_MODE, RT5645_IRQ_PSV_MODE);
2554 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS,
2555 RT5645_MIC2_OVCD_EN, RT5645_MIC2_OVCD_EN);
2556 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
2557 RT5645_GP1_PIN_IRQ, RT5645_GP1_PIN_IRQ);
2558 switch (rt5645->pdata.jd_mode) {
2559 case 1:
2560 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1,
2561 RT5645_JD1_MODE_MASK,
2562 RT5645_JD1_MODE_0);
2563 break;
2564 case 2:
2565 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1,
2566 RT5645_JD1_MODE_MASK,
2567 RT5645_JD1_MODE_1);
2568 break;
2569 case 3:
2570 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1,
2571 RT5645_JD1_MODE_MASK,
2572 RT5645_JD1_MODE_2);
2573 break;
2574 default:
2575 break;
2576 }
2577 }
2578
2546 if (rt5645->i2c->irq) { 2579 if (rt5645->i2c->irq) {
2547 ret = request_threaded_irq(rt5645->i2c->irq, NULL, rt5645_irq, 2580 ret = request_threaded_irq(rt5645->i2c->irq, NULL, rt5645_irq,
2548 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING 2581 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING
diff --git a/sound/soc/codecs/rt5645.h b/sound/soc/codecs/rt5645.h
index c72220abdbc0..a815e36a2bdb 100644
--- a/sound/soc/codecs/rt5645.h
+++ b/sound/soc/codecs/rt5645.h
@@ -594,6 +594,7 @@
594#define RT5645_M_DAC1_HM_SFT 14 594#define RT5645_M_DAC1_HM_SFT 14
595#define RT5645_M_HPVOL_HM (0x1 << 13) 595#define RT5645_M_HPVOL_HM (0x1 << 13)
596#define RT5645_M_HPVOL_HM_SFT 13 596#define RT5645_M_HPVOL_HM_SFT 13
597#define RT5645_IRQ_PSV_MODE (0x1 << 12)
597 598
598/* SPK Left Mixer Control (0x46) */ 599/* SPK Left Mixer Control (0x46) */
599#define RT5645_G_RM_L_SM_L_MASK (0x3 << 14) 600#define RT5645_G_RM_L_SM_L_MASK (0x3 << 14)
@@ -1350,6 +1351,10 @@
1350#define RT5645_PWR_CLK25M_PU (0x1 << 4) 1351#define RT5645_PWR_CLK25M_PU (0x1 << 4)
1351#define RT5645_IRQ_CLK_MCLK (0x0 << 3) 1352#define RT5645_IRQ_CLK_MCLK (0x0 << 3)
1352#define RT5645_IRQ_CLK_INT (0x1 << 3) 1353#define RT5645_IRQ_CLK_INT (0x1 << 3)
1354#define RT5645_JD1_MODE_MASK (0x3 << 0)
1355#define RT5645_JD1_MODE_0 (0x0 << 0)
1356#define RT5645_JD1_MODE_1 (0x1 << 0)
1357#define RT5645_JD1_MODE_2 (0x2 << 0)
1353 1358
1354/* VAD Control 4 (0x9d) */ 1359/* VAD Control 4 (0x9d) */
1355#define RT5645_VAD_SEL_MASK (0x3 << 8) 1360#define RT5645_VAD_SEL_MASK (0x3 << 8)
@@ -1638,6 +1643,7 @@
1638#define RT5645_OT_P_SFT 10 1643#define RT5645_OT_P_SFT 10
1639#define RT5645_OT_P_NOR (0x0 << 10) 1644#define RT5645_OT_P_NOR (0x0 << 10)
1640#define RT5645_OT_P_INV (0x1 << 10) 1645#define RT5645_OT_P_INV (0x1 << 10)
1646#define RT5645_IRQ_JD_1_1_EN (0x1 << 9)
1641 1647
1642/* IRQ Control 2 (0xbe) */ 1648/* IRQ Control 2 (0xbe) */
1643#define RT5645_IRQ_MB1_OC_MASK (0x1 << 15) 1649#define RT5645_IRQ_MB1_OC_MASK (0x1 << 15)
@@ -2120,6 +2126,7 @@ enum {
2120#define RT5645_RXDP2_SEL_SFT (3) 2126#define RT5645_RXDP2_SEL_SFT (3)
2121 2127
2122/* General Control3 (0xfc) */ 2128/* General Control3 (0xfc) */
2129#define RT5645_JD_PSV_MODE (0x1 << 12)
2123#define RT5645_IRQ_CLK_GATE_CTRL (0x1 << 11) 2130#define RT5645_IRQ_CLK_GATE_CTRL (0x1 << 11)
2124#define RT5645_MICINDET_MANU (0x1 << 7) 2131#define RT5645_MICINDET_MANU (0x1 << 7)
2125 2132