From 9bc7b45fc90097f27a2925ae2a2609b641687368 Mon Sep 17 00:00:00 2001 From: Karthikeyan Mani Date: Wed, 25 Jul 2018 12:41:03 -0700 Subject: [PATCH] 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 --- asoc/codecs/wcd9xxx-irq.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/asoc/codecs/wcd9xxx-irq.c b/asoc/codecs/wcd9xxx-irq.c index b192e992d1..ad15470a39 100644 --- a/asoc/codecs/wcd9xxx-irq.c +++ b/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],