From: Chris Fries Date: Tue, 7 Dec 2010 18:26:32 +0000 (-0600) Subject: [ARM] mfd: cpcap: Reduce audio dock pops X-Git-Tag: firefly_0821_release~9834^2~268 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d68fe8f9899bbb4d601410f53bb9c9828dbfdd44;p=firefly-linux-kernel-4.4.55.git [ARM] mfd: cpcap: Reduce audio dock pops Manage the audio dock and CPCAP Audio state tightly, to avoid pops on the (amplified) docks. Change-Id: Ie687b8fc19892eb1ea56f8aed2be78d2a4dcb334 Signed-off-by: Iliyan Malchev --- diff --git a/drivers/mfd/cpcap-whisper.c b/drivers/mfd/cpcap-whisper.c index a5a46e43743d..673871101a35 100644 --- a/drivers/mfd/cpcap-whisper.c +++ b/drivers/mfd/cpcap-whisper.c @@ -33,6 +33,7 @@ #include #include +void tegra_cpcap_audio_dock_state(bool connected); #define SENSE_USB_CLIENT (CPCAP_BIT_ID_FLOAT_S | \ CPCAP_BIT_VBUSVLD_S | \ @@ -336,6 +337,7 @@ static void whisper_notify(struct cpcap_whisper_data *di, enum cpcap_accy accy) switch_set_state(&di->csdev, 0); memset(di->dock_id, 0, CPCAP_WHISPER_ID_SIZE); memset(di->dock_prop, 0, CPCAP_WHISPER_PROP_SIZE); + tegra_cpcap_audio_dock_state(false); } } @@ -372,6 +374,7 @@ static void whisper_audio_check(struct cpcap_whisper_data *di) audio = (req.result[CPCAP_ADC_USB_ID] > ADC_AUDIO_THRES) ? 1 : 0; switch_set_state(&di->asdev, audio); + tegra_cpcap_audio_dock_state(!!audio); pr_info("%s: Audio cable %s present\n", __func__, (audio ? "is" : "not")); diff --git a/drivers/mfd/tegra-cpcap-audio.c b/drivers/mfd/tegra-cpcap-audio.c index 1ba6c70d5f4f..020592ab1af7 100644 --- a/drivers/mfd/tegra-cpcap-audio.c +++ b/drivers/mfd/tegra-cpcap-audio.c @@ -43,6 +43,7 @@ static struct cpcap_audio_stream current_input = { }; static int codec_rate; static int stdac_rate; +static bool dock_connected; static int cpcap_audio_ctl_open(struct inode *inode, struct file *file) { @@ -449,6 +450,21 @@ static struct miscdevice cpcap_audio_ctl = { .fops = &cpcap_audio_ctl_fops, }; +/* Couple the CPCAP and Dock audio state, to avoid pops */ +void tegra_cpcap_audio_dock_state(bool connected) +{ + pr_debug("%s: %s", __func__, connected ? "connected" : "disconnected"); + + mutex_lock(&cpcap_lock); + dock_connected = connected; + /* Borrow (unused) "ext output" to keep dock speaker amplifier on. */ + pdata->state->ext_primary_speaker = dock_connected ? + CPCAP_AUDIO_OUT_EMU_STEREO : CPCAP_AUDIO_OUT_NONE; + cpcap_audio_set_audio_state(pdata->state); + mutex_unlock(&cpcap_lock); +} +EXPORT_SYMBOL(tegra_cpcap_audio_dock_state); + static int cpcap_audio_probe(struct platform_device *pdev) { int rc;