Browse Source

asoc: codecs: cancel all delayed work during SSR/PDR

Cancel any pending delayed work in device down call
to ensure no work is scheduled during or after a
SSR/PDR sequence.

Change-Id: I4cc89cb1a9d8be732c978044d4eea3cf6644ec30
Signed-off-by: Karthikeyan Mani <[email protected]>
Signed-off-by: Banajit Goswami <[email protected]>
Karthikeyan Mani 6 years ago
parent
commit
e964a75f32
1 changed files with 24 additions and 0 deletions
  1. 24 0
      asoc/codecs/wcd934x/wcd934x.c

+ 24 - 0
asoc/codecs/wcd934x/wcd934x.c

@@ -9972,11 +9972,35 @@ static int tavil_device_down(struct wcd9xxx *wcd9xxx)
 	struct snd_soc_codec *codec;
 	struct tavil_priv *priv;
 	int count;
+	int decimator;
+	int ret;
 
 	codec = (struct snd_soc_codec *)(wcd9xxx->ssr_priv);
 	priv = snd_soc_codec_get_drvdata(codec);
 	for (count = 0; count < NUM_CODEC_DAIS; count++)
 		priv->dai[count].bus_down_in_recovery = true;
+
+	if (delayed_work_pending(&priv->spk_anc_dwork.dwork))
+		cancel_delayed_work(&priv->spk_anc_dwork.dwork);
+	for (decimator = 0; decimator < WCD934X_NUM_DECIMATORS; decimator++) {
+		if (delayed_work_pending
+				(&priv->tx_mute_dwork[decimator].dwork))
+			cancel_delayed_work
+				(&priv->tx_mute_dwork[decimator].dwork);
+		if (delayed_work_pending
+				(&priv->tx_hpf_work[decimator].dwork))
+			cancel_delayed_work
+				(&priv->tx_hpf_work[decimator].dwork);
+	}
+	if (delayed_work_pending(&priv->power_gate_work))
+		cancel_delayed_work_sync(&priv->power_gate_work);
+	if (delayed_work_pending(&priv->mbhc->wcd_mbhc.mbhc_btn_dwork)) {
+		ret = cancel_delayed_work(&priv->mbhc->wcd_mbhc.mbhc_btn_dwork);
+		if (ret)
+			priv->mbhc->wcd_mbhc.mbhc_cb->lock_sleep
+					(&priv->mbhc->wcd_mbhc, false);
+	}
+
 	if (priv->swr.ctrl_data)
 		swrm_wcd_notify(priv->swr.ctrl_data[0].swr_pdev,
 				SWR_DEVICE_DOWN, NULL);