Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 279f92c8 authored by Laxminath Kasam's avatar Laxminath Kasam
Browse files

ASoC: wcd9335: Fix digital power collapse when XO shutdown



When XO shutdown happens, workqueue scheduled for digital
power collapse is not triggered. In tasha suspend, put
digital core in power collapse if workqueue is pending.

Change-Id: I4ae9bad6b18dd54217fcad5ad60673ee726f4700
Signed-off-by: default avatarLaxminath Kasam <lkasam@codeaurora.org>
parent 494ca1d5
Loading
Loading
Loading
Loading
+24 −8
Original line number Diff line number Diff line
@@ -10000,15 +10000,9 @@ static struct snd_soc_dai_driver tasha_dai[] = {
	},
};

static void tasha_codec_power_gate_work(struct work_struct *work)
static void tasha_codec_power_gate_digital_core(struct tasha_priv *tasha)
{
	struct tasha_priv *tasha;
	struct delayed_work *dwork;
	struct snd_soc_codec *codec;

	dwork = to_delayed_work(work);
	tasha = container_of(dwork, struct tasha_priv, power_gate_work);
	codec = tasha->codec;
	struct snd_soc_codec *codec = tasha->codec;

	if (!codec)
		return;
@@ -10039,6 +10033,22 @@ exit:
	mutex_unlock(&tasha->power_lock);
}

static void tasha_codec_power_gate_work(struct work_struct *work)
{
	struct tasha_priv *tasha;
	struct delayed_work *dwork;
	struct snd_soc_codec *codec;

	dwork = to_delayed_work(work);
	tasha = container_of(dwork, struct tasha_priv, power_gate_work);
	codec = tasha->codec;

	if (!codec)
		return;

	tasha_codec_power_gate_digital_core(tasha);
}

/* called under power_lock acquisition */
static int tasha_dig_core_remove_power_collapse(struct snd_soc_codec *codec)
{
@@ -11543,7 +11553,13 @@ static struct snd_soc_codec_driver soc_codec_dev_tasha = {
#ifdef CONFIG_PM
static int tasha_suspend(struct device *dev)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct tasha_priv *tasha = platform_get_drvdata(pdev);

	dev_dbg(dev, "%s: system suspend\n", __func__);
	if (cancel_delayed_work_sync(&tasha->power_gate_work))
		tasha_codec_power_gate_digital_core(tasha);

	return 0;
}