mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +09:00
ASoC: es8316: add interface for rk_headset
Change-Id: I62f7e78ca4003f6ab90c943a187babd274acc1de Signed-off-by: zhangjun <zhangjun@rock-chips.com>
This commit is contained in:
@@ -40,6 +40,8 @@
|
||||
#define GPIO_HIGH 1
|
||||
#define es8316_DEF_VOL 0x1e
|
||||
|
||||
static struct snd_soc_codec *es8316_codec;
|
||||
|
||||
static const struct reg_default es8316_reg_defaults[] = {
|
||||
{0x00, 0x03}, {0x01, 0x03}, {0x02, 0x00}, {0x03, 0x20},
|
||||
{0x04, 0x11}, {0x05, 0x00}, {0x06, 0x11}, {0x07, 0x00},
|
||||
@@ -742,7 +744,8 @@ static void es8316_pcm_shutdown(struct snd_pcm_substream *substream,
|
||||
}
|
||||
|
||||
if (--es8316->pwr_count == 0) {
|
||||
snd_soc_write(codec, ES8316_SYS_PDN_REG0D, 0x3F);
|
||||
if (!es8316->hp_inserted)
|
||||
snd_soc_write(codec, ES8316_SYS_PDN_REG0D, 0x3F);
|
||||
snd_soc_write(codec, ES8316_CLKMGR_CLKSW_REG01, 0xF3);
|
||||
}
|
||||
}
|
||||
@@ -837,7 +840,8 @@ static int es8316_set_bias_level(struct snd_soc_codec *codec,
|
||||
snd_soc_write(codec, ES8316_HPMIX_PDN_REG15, 0x33);
|
||||
snd_soc_write(codec, ES8316_HPMIX_VOL_REG16, 0x00);
|
||||
snd_soc_write(codec, ES8316_ADC_PDN_LINSEL_REG22, 0xC0);
|
||||
snd_soc_write(codec, ES8316_SYS_PDN_REG0D, 0x3F);
|
||||
if (!es8316->hp_inserted)
|
||||
snd_soc_write(codec, ES8316_SYS_PDN_REG0D, 0x3F);
|
||||
snd_soc_write(codec, ES8316_SYS_LP1_REG0E, 0x3F);
|
||||
snd_soc_write(codec, ES8316_SYS_LP2_REG0F, 0x1F);
|
||||
snd_soc_write(codec, ES8316_RESET_REG00, 0x00);
|
||||
@@ -952,6 +956,7 @@ static int es8316_suspend(struct snd_soc_codec *codec)
|
||||
|
||||
static int es8316_resume(struct snd_soc_codec *codec)
|
||||
{
|
||||
struct es8316_priv *es8316 = snd_soc_codec_get_drvdata(codec);
|
||||
int ret;
|
||||
|
||||
es8316_reset(codec); /* UPDATED BY DAVID,15-3-5 */
|
||||
@@ -970,7 +975,8 @@ static int es8316_resume(struct snd_soc_codec *codec)
|
||||
snd_soc_write(codec, ES8316_HPMIX_SWITCH_REG14, 0x00);
|
||||
snd_soc_write(codec, ES8316_HPMIX_PDN_REG15, 0x33);
|
||||
snd_soc_write(codec, ES8316_HPMIX_VOL_REG16, 0x00);
|
||||
snd_soc_write(codec, ES8316_SYS_PDN_REG0D, 0x3F);
|
||||
if (!es8316->hp_inserted)
|
||||
snd_soc_write(codec, ES8316_SYS_PDN_REG0D, 0x3F);
|
||||
snd_soc_write(codec, ES8316_SYS_LP1_REG0E, 0xFF);
|
||||
snd_soc_write(codec, ES8316_SYS_LP2_REG0F, 0xFF);
|
||||
snd_soc_write(codec, ES8316_CLKMGR_CLKSW_REG01, 0xF3);
|
||||
@@ -989,6 +995,29 @@ static irqreturn_t es8316_irq_handler(int irq, void *data)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/*
|
||||
* Call from rk_headset_irq_hook_adc.c
|
||||
*
|
||||
* Enable micbias for HOOK detection and disable external Amplifier
|
||||
* when jack insertion.
|
||||
*/
|
||||
int es8316_headset_detect(int jack_insert)
|
||||
{
|
||||
struct es8316_priv *es8316 = snd_soc_codec_get_drvdata(es8316_codec);
|
||||
|
||||
es8316->hp_inserted = jack_insert;
|
||||
|
||||
/*enable micbias and disable PA*/
|
||||
if (jack_insert) {
|
||||
snd_soc_update_bits(es8316_codec,
|
||||
ES8316_SYS_PDN_REG0D, 0x3f, 0);
|
||||
es8316_enable_spk(es8316, false);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(es8316_headset_detect);
|
||||
|
||||
static void hp_work(struct work_struct *work)
|
||||
{
|
||||
struct es8316_priv *es8316;
|
||||
@@ -1008,7 +1037,6 @@ static void hp_work(struct work_struct *work)
|
||||
}
|
||||
}
|
||||
|
||||
static struct snd_soc_codec *es8316_codec;
|
||||
static int es8316_probe(struct snd_soc_codec *codec)
|
||||
{
|
||||
struct es8316_priv *es8316 = snd_soc_codec_get_drvdata(codec);
|
||||
@@ -1042,7 +1070,9 @@ static int es8316_probe(struct snd_soc_codec *codec)
|
||||
snd_soc_write(codec, ES8316_HPMIX_SWITCH_REG14, 0x00);
|
||||
snd_soc_write(codec, ES8316_HPMIX_PDN_REG15, 0x33);
|
||||
snd_soc_write(codec, ES8316_HPMIX_VOL_REG16, 0x00);
|
||||
snd_soc_write(codec, ES8316_SYS_PDN_REG0D, 0x3F);
|
||||
if (!es8316->hp_inserted)
|
||||
snd_soc_write(codec, ES8316_SYS_PDN_REG0D,
|
||||
0x3F);
|
||||
snd_soc_write(codec, ES8316_SYS_LP1_REG0E, 0xFF);
|
||||
snd_soc_write(codec, ES8316_SYS_LP2_REG0F, 0xFF);
|
||||
snd_soc_write(codec, ES8316_CLKMGR_CLKSW_REG01, 0xF3);
|
||||
|
||||
Reference in New Issue
Block a user