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

Commit 9bc7b45f authored by Karthikeyan Mani's avatar Karthikeyan Mani Committed by Gerrit - the friendly Code Review server
Browse files

asoc: codecs: delay codec irq handler during ssr



Put the irq handler of codec device to sleep if device is
not up, to allow other threads to execute meanwhile the device
will be up.

Change-Id: Ic7421bdf236be52070b6d5fcd774b0641368bf2b
Signed-off-by: default avatarKarthikeyan Mani <kmani@codeaurora.org>
parent 1fdb5b3e
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -295,6 +295,7 @@ static irqreturn_t wcd9xxx_irq_thread(int irq, void *data)
	static DEFINE_RATELIMIT_STATE(ratelimit, 5 * HZ, 1);
	struct wcd9xxx_core_resource *wcd9xxx_res = data;
	int num_irq_regs = wcd9xxx_res->num_irq_regs;
	struct wcd9xxx *wcd9xxx;
	u8 status[4], status1[4] = {0}, unmask_status[4] = {0};

	if (unlikely(wcd9xxx_lock_sleep(wcd9xxx_res) == false)) {
@@ -309,6 +310,23 @@ static irqreturn_t wcd9xxx_irq_thread(int irq, void *data)
		goto err_disable_irq;
	}

	wcd9xxx = (struct wcd9xxx *)wcd9xxx_res->parent;
	if (!wcd9xxx) {
		dev_err(wcd9xxx_res->dev,
			"%s: Codec core not supplied\n", __func__);
		goto err_disable_irq;
	}

	if (!wcd9xxx->dev_up) {
		dev_info_ratelimited(wcd9xxx_res->dev, "wcd9xxx dev not up\n");
		/*
		 * sleep to not block the core when device is
		 * not up (slimbus will not be available) to
		 * process interrupts.
		 */
		msleep(10);
	}

	memset(status, 0, sizeof(status));
	ret = regmap_bulk_read(wcd9xxx_res->wcd_core_regmap,
		wcd9xxx_res->intr_reg[WCD9XXX_INTR_STATUS_BASE],