From f1035cd51c4a46dc041f0440e3ca092488596e31 Mon Sep 17 00:00:00 2001 From: Aditya Bavanari Date: Tue, 19 May 2020 10:41:35 +0530 Subject: [PATCH] asoc: codecs: Add delay to eliminate playback pause post SSR on hs Add delay in post ssr to eliminate playback pause on euro usbc headset. Post ssr, headset is detected as headphone as HPH PA gets turned ON before the completion of wcd_correct_swch_plug workqueue in MBHC. Change-Id: Ib0334b37aa12b7e7371146b26eb3a1f4484656a3 Signed-off-by: Aditya Bavanari --- asoc/codecs/rouleur/internal.h | 1 + asoc/codecs/rouleur/rouleur.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/asoc/codecs/rouleur/internal.h b/asoc/codecs/rouleur/internal.h index 233ca519be57..c6e7d112ee96 100644 --- a/asoc/codecs/rouleur/internal.h +++ b/asoc/codecs/rouleur/internal.h @@ -83,6 +83,7 @@ struct rouleur_priv { struct mutex rx_clk_lock; struct mutex main_bias_lock; bool dev_up; + bool usbc_hs_status; }; struct rouleur_micbias_setting { diff --git a/asoc/codecs/rouleur/rouleur.c b/asoc/codecs/rouleur/rouleur.c index 480e0ce7a522..7d4e68c57fdf 100644 --- a/asoc/codecs/rouleur/rouleur.c +++ b/asoc/codecs/rouleur/rouleur.c @@ -1341,6 +1341,17 @@ static int rouleur_get_logical_addr(struct swr_device *swr_dev) return 0; } +static bool get_usbc_hs_status(struct snd_soc_component *component, + struct wcd_mbhc_config *mbhc_cfg) +{ + if (mbhc_cfg->enable_usbc_analog) { + if (!(snd_soc_component_read32(component, ROULEUR_ANA_MBHC_MECH) + & 0x20)) + return true; + } + return false; +} + static int rouleur_event_notify(struct notifier_block *block, unsigned long val, void *data) @@ -1373,6 +1384,8 @@ static int rouleur_event_notify(struct notifier_block *block, rouleur->dev_up = false; rouleur->mbhc->wcd_mbhc.deinit_in_progress = true; mbhc = &rouleur->mbhc->wcd_mbhc; + rouleur->usbc_hs_status = get_usbc_hs_status(component, + mbhc->mbhc_cfg); rouleur_mbhc_ssr_down(rouleur->mbhc, component); rouleur_reset(rouleur->dev, 0x01); break; @@ -1394,6 +1407,8 @@ static int rouleur_event_notify(struct notifier_block *block, __func__); } else { rouleur_mbhc_hs_detect(component, mbhc->mbhc_cfg); + if (rouleur->usbc_hs_status) + mdelay(500); } rouleur->mbhc->wcd_mbhc.deinit_in_progress = false; rouleur->dev_up = true;