Browse Source

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: Karthikeyan Mani <[email protected]>
Karthikeyan Mani 6 years ago
parent
commit
9bc7b45fc9
1 changed files with 18 additions and 0 deletions
  1. 18 0
      asoc/codecs/wcd9xxx-irq.c

+ 18 - 0
asoc/codecs/wcd9xxx-irq.c

@@ -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],